如何读取坐标 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
如何读取 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