如何读取坐标 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?的主要内容,如果未能解决你的问题,请参考以下文章
请问python中如何读取一个csv或者dat文件,并储存为一个二维数组?
Python - 读取文本并写入 csv。将空列替换为默认的“N/A”值