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

How do I read a coordinate csv file and break into E,N,Z and Station?

如何读取 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 工作这个,所以想知道有没有更原生的版本

我有一个文件;

Header (ignore)  
Start line (ignore)  
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)  
End of file (0, 0.000, 0.000, 0.000, END)  

示例文件;

Header, 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, END  

就编程而言,我是个黑客,需要帮助,所以到目前为止我已经有了这个。这是废话,但是一个开始。

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

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

要读取 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"
}

如果您无法安装和运行 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