使用TCL将带逗号的字符串设置为CSV文件中的单个变量

时间:2015-09-14 09:21:51

标签: csv tcl

我有一个如下的Csv文件:

Production,FALSE,Other Line,Release,UOF-919 BASE,3A001A11,9X999,PC,"Jap,Ind",006

我正在阅读并使用tcl将值设置为变量,如下所示:

set fileIn [open "C:/myfile.csv" r]

        while {[gets $fileIn sLine] >= 0} {
            set lsLine [split $sLine ","]
            set sType "Hardware"
            set sName [lindex $lsLine 1]
            set Sdev [lindex $lsLine 2]
            set spara [lindex $lsLine 3]
            set sDescription [lindex $lsLine 4]
            set sManage [lindex $lsLine 5]
            set sconnect [lindex $lsLine 6]
            set sUOM [lindex $lsLine 7]
            set sCountry [lindex $lsLine 8]

            #my operations
            }
    flush $fileId
    close $fileId
    }

此处我无法将" Jap,Ind" 设置为 sCountry ,因为它在引号内已经有一个逗号。任何人都可以帮我设置吗?我是TCL的新人。

1 个答案:

答案 0 :(得分:1)

package require csv

set fileIn [open C:/myfile.csv r]

    while {[gets $fileIn sLine] >= 0} {
        set lsLine [csv::split $sLine]
        lassign $lsLine - sName Sdev spara sDescription sManage sConnect sUOM sCountry
    }

    close $fileId
}

切勿尝试使用split解析CSV数据。它会以泪水结束。

请注意,这假设您要从索引1(即第二个元素)分配给sName。第一个元素分配给虚拟变量-

对于稀疏分配,您可以使用(假设您需要#8而不是#9)

lassign $lsLine - - Sdev - - sManage sConnect sUOM sCountry

foreach idx {2 5 6 7 8} name {Sdev sManage sConnect sUOM sCountry} {
    set $name [lindex $lsLine $idx]
}

如果您没有安装csv,可以从命令行使用teacup install csv来获取它。

文档:closecsv包,getslassignopenpackageset,{{ 3}}