如何读取坐标 csv 文件并分解为 E、N、Z 和 Station?

Posted

技术标签:

【中文标题】如何读取坐标 csv 文件并分解为 E、N、Z 和 Station?【英文标题】:How do I read a coordinate csv file and break into E,N,Z and Station? 【发布时间】:2020-09-03 06:38:32 【问题描述】:

如何读取 csv 文件并将 Northing、Easting、RL 和 StationName 放入单独的变量中,以便稍后在代码中调用?

...line3="$STN1"  
line4="$E1"  
line5="$N1"  
line6="$Z1"  
line7="$STN2"  
line8="$E2"  
line9="$N2"  
line10="$Z2"...

我正在使用一个名为 Surpac 的程序,它使用 TCL/SCL(Surpac 命令语言)作为内部语言来运行宏,所以我不确定如何让 tcllib CSV 为这个工作,所以我想知道如果有更原生的版本。

我有一个这样的文件;

标题(忽略) 起始线(忽略) stringno, Northing, Easting, RL, StationName, other, crap, I, don't, care, about stringno, Northing, Easting, RL, StationName, other, crap, I, don't, care, about SegmentBreak (0,0,0,0) Stringno、Northing、Easting、RL、StationName、... SegmentBreak (0,0,0,0) 文件结尾 (0, 0.000, 0.000, 0.000, END)

示例文件;

标题,x,y,z 0, 0.000, 0.000, 0.000, 0 1, 1724649.512, 124030.344, 139.540, 120100-01,58,0.0159,0.0128,0.0024 1、1724767.644、125844.370、107.213、12100-13,68,0.0108,0.009,0.0026 ...... 1、1724815.346、1285816.668、99.484、12000-14,70,0.0113,0.0092,0.0026 1, 1724797.046, 125785.089, 90.848, 12000-16,87,0.0127,0.009,0.0027 0, 0.000, 0.000, 0.000, 1、1725028.806、125903.122、-1318.821、SD152,2038,0.0154,0.0124,0.0097 1, 1725028.899, 125901.241, -1322.790, 857002,2039,0.0156,0.0125,0.0098 0, 0.000, 0.000, 0.000, 0, 0.000, 0.000, 0.000, 结束

就编程而言,我是个 hack 并且需要帮助,所以到目前为止我有这个。这是废话,但只是一个开始。

set stnfile [open $csvfile r]  
gets $stnfile header  
gets $stnfile nosence  
gets $stnfile STN1  
gets $stnfile STN2..... 

毫不奇怪,这只是将每一行作为变量:STNx

【问题讨论】:

【参考方案1】:

如果您无法安装并运行 tcllib,对于像这样的简单数据,可以使用 split 将一行分成一个列表:

set stnfile [open $csvfile r]
# Read and discard the first two lines
gets $stnfile
gets $stnfile
# Read the rest in a loop
while [gets $stnfile line] > 0] 
    # Split on comma and assign the first five elements to variables
    lassign [split $line ,] stringno northing easting rl stationname
    # Exit on END - beware of the leading space!
    if $stationname eq " END"  break 
    # Check for a segment break
    if $stringno == 0 && $northing == 0 && $easting == 0 && $rl == 0 
        # Do something with a break line?
     else 
        # Do something else with a regular line?
    

close $stnfile

【讨论】:

感谢肖恩的帮助,也感谢您的帮助!我调整了代码,它运行良好。原来 break 导致宏刚刚结束,所以我用if $stationname eq " END" set N1 "" set E1 "" set Z1 "" set S1 "" 替换了“break”我还拉出循环来分别定义每个变量。这样做的原因是我只有 22 个空格要填充,因此读取每一行不会使代码变长,并且我需要稍后同时调用每个变量。我真的不知道如何使用循环【参考方案2】:

要读取 CSV 文件,请使用 Tcllib 中的 csv package。

package require struct::matrix
package require csv

# To hold the data we've read in
struct::matrix Data

# Do the read of the file. Note that you want mode 'auto' here
set f [open "input.csv"]
csv::read2matrix $f Data "," auto
close $f

现在我们可以处理Data

# Remove the header rows
Data delete row 0
Data delete row 0;  # NB: second row has moved up one

# Remove the footer row
Data delete rows 1

# Go over the rows that remain:
for set r 0 $r < [Data rows] incr r 
    # Split the first bits of the row into variables; drops junk on end of line
    lassign [Data get row $r] stringno Northing Easting RL StationName
    # Skip zero lines
    if !$Northing && !$Easting && !$RL 
        continue
    
    # Do stuff with the row; I'm just printing things because I don't know what else...
    puts "($Northing,$Easting,$RL) --> $StationName"

【讨论】:

以上是关于如何读取坐标 csv 文件并分解为 E、N、Z 和 Station?的主要内容,如果未能解决你的问题,请参考以下文章

如何将matlab中的坐标系进行旋转

请问python中如何读取一个csv或者dat文件,并储存为一个二维数组?

Python - 读取文本并写入 csv。将空列替换为默认的“N/A”值

如何使用 PHP 读取 CSV 文件并在 Table/DIV 中显示内容?

中海达RTK使用说明之控制点数据导入手薄

R:如何读取具有 15 位产品 ID 数字的 CSV 文件?