我正在尝试使用set fid [open temp.csv a]
'a'append命令从TCL脚本向CSV文件写入一些数据。我看到所有数据都从下一行追加。但我希望将我的新数据集添加到下一列。我该怎么办?
set fid [open temp.csv a]
foreach line $data {
if { [regexp "SUM" $line == 1] } {
incr line_counter
if { [expr {$line_counter % 2}] == 0} {
if {[regexp {(MBytes) +([0-9\.]*)} $line match pre tput]==1 } {
puts $fid " $line_counter Throughput: $tput Mbps"
}
}
}
}
close $fid
set fid [open temp.csv r]
while {[gets $fid chars] >= 0} {
puts $chars
}
close $fid
答案 0 :(得分:2)
open
命令中的“a”标志意味着“以附加模式打开文件”,即创建文件(如果该文件不存在),否则不丢弃其内容并只放置“流指针”到文件的末尾,以便下一次调用该文件描述符上的puts
将数据附加到文件中。
因此,您的问题可能是您不明白一般文件操作命令永远不会解释文件 1 中的数据:它只是一个不透明的字节流;对数据的任何解释都必须在其他地方进行。这就是serialization and deserialization的概念出现的地方。
我认为您应该从csv package查看专门的tcllib。
1 那么,文件流可以在一定程度上解释其文件的内容,以便更轻松地处理文本文件:您可以specify the behaviour of an opened file关于字符编码和换行符进行通道
答案 1 :(得分:2)
要将列添加到CSV文件,您必须将数据添加到该CSV文件的每一行(或至少包含您关注的数据的行)。这需要完全重写文件,因为您无法在一般文本文件中插入数据(CSV是其特化)而无需重写文件的所有后续行。追加模式肯定会出错。
尝试在Tcllib中使用CSV包。特别是read the CSV file到矩阵中,add a column到该矩阵,然后将矩阵序列化为CSV格式。
答案 2 :(得分:0)
TCL中已有一个CSV包,为什么要重新发明轮子呢? http://tcllib.sourceforge.net/doc/csv.html