首页 > 解决方案 > Tcl如何修改csv,它可以在不使用tcllib的情况下控制另一个文件的数据

问题描述

我有很多进程文件,它包含版本,我有正则表达式其中的某些行并将它们导入到 txt 文件中,txt 格式就像

   #process #AA_version       #BB_version
   a11      Aa/10.10-d87_1    Bb/10.57-d21_1
   a15      Aa/10.15-d37_1    Bb/10.57-d28_1
   a23      Aa/10.20-d51_1    Bb/10.57-d29_3

然后我将 txt 更改为 csv 格式,例如

,#process,#AA_version,#BB_version
,a11,Aa/10.10-d87_1,Bb/10.57-d21_1
,a15,Aa/10.15-d37_1,Bb/10.57-d28_1
,a23,Aa/10.20-d51_1,Bb/10.57-d29_3

现在我想写一个 tcl(get_version.tcl) 它可以在解析csv文件后生成相应的版本(在我正则表达式版本的文件中)

前任。如果我 tclsh get_version.tcl 来解析 csv 文件,输入我要修改的进程(a11),它将puts是当前版本 AA_version: Aa/10.10-d87_1BB_version:Bb/10.57-d21_1并且我可以修改版本并且 get_version.tcl 可以更新 csv 文件和文件(我正则表达式)同时。

可以吗?而且我无法安装 tcllib ,我可以在没有 tcllib 的情况下做这些事情吗?里面的命令太多,不知道怎么下手,多谢帮助~

如果我想更改进程 a11 的 AA_version,并使用

get_version.tcl a11 
AA_version = **Aa/10.10-d87_1** 
BB_version = **Bb/10.57-d21_1**

它将读取 csv 文件并添加新版本(ex.Aa/10.13-d97_1),此操作将更改文件(1.添加新行 AA_version =Aa/10.13-d97_1 2.修改 AA_version = Aa/10.10 -d87_1 ->#AA_version = Aa/10.10-d87_1) 在原始文件中

标签: csvtcl

解决方案


我会像这样处理每一行:

split [regsub -all {\s+} $line "\u0000"] "\u0000"

(tcllibtextutil::splitx命令做类似的事情。)

如果你的输入数据中没有逗号或引号——看起来你可以很容易地保证这一点——那么你可以join $record ","得到一行你可以用puts. 如果您确实有逗号或引号或类似的东西,请使用 Tcllib csv 包,因为它可以正确处理棘手的边缘情况。


作为一个简单的标准输入→标准输出过滤器,脚本将是:

while {[gets stdin line] >= 0} {
    set data [split [regsub -all {\s+} $line "\u0000"] "\u0000"]
    # Any additional column mangling here
    puts [join $data ","]
}

推荐阅读