多维数组的CSV结构变量

gcxthw6b  于 2023-05-04  发布在  其他
关注(0)|答案(1)|浏览(163)

我有一个csv结构预加载到一个变量从一个文件只是为了测试,因为源将来自一个命令的结果。
变量内容如下:

ID,Date,Who,Text
123,2023-01-01,John,"This is a single line."
234,2023-02-01,Jane,"This is line 1
line2
the line 3 is this one"
457,2023-04-06,Mary,"Another single line."

“line2”的行可能是空的,也可能不是空的。
那么,我如何将变量的内容解析为数组?我希望数组是这样的:

$ set arraycsv(123)
2023-01-01 John {This is a single line.}
$ set arraycsv(234)
2023-02-01 Jane {This is line 1 line2 the line 3 is this one}

...然后这个数组被剩下的代码处理。必须转换3行引号以删除任何“”“”换行符。
我看了看csv包,但我有点困惑,因为我从来没有用过它之前。任何帮助都是好的。谢谢

eivnm1vs

eivnm1vs1#

您需要的键csv procssplit(obvs)和iscomplete

package require csv

set args [lassign $argv filename]
set fh [open $filename r]
array set arraycsv {}
gets $fh header

while {[gets $fh line] != -1} {
    while {![csv::iscomplete $line]} {
        append line " " [gets $fh]
    }
    set fields [csv::split $line]
    if {[llength $fields] == 0} then continue
    set arraycsv([lindex $fields 0]) [lrange $fields 1 end]
}

parray arraycsv

当CSV文件的 * 最后一行 * 不完整时,需要执行更多代码来保护无限循环。
哦,既然你已经有了变量中的数据

array set arraycsv {}
set lines [split $contents \n]
set len [llength $lines]

# starting at 1 to skip the header line
for {set i 1} {$i < $len} {incr i} {
    set line [lindex $lines $i]
    while {![csv::iscomplete $line]} {
        incr i
        append line " " [lindex $lines $i]
    }
    set fields [csv::split $line]
    if {[llength $fields] == 0} then continue
    set arraycsv([lindex $fields 0]) [lrange $fields 1 end]
}

parray arraycsv

相关问题