csv - 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_1
BB_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) 在原始文件中
解决方案
我会像这样处理每一行:
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 ","]
}
推荐阅读
- python - Lambda 未加载加密共享库
- ios - iOS 应用程序因终止原因而崩溃:命名空间 SPRINGBOARD,代码 0x8badf00d
- firebase - Cloud Functions puppeteer 错误:http://www.google.com 上的 net::ERR_NAME_RESOLUTION_FAILED
- android - 谷歌应用内购买:如何检查消耗品购买状态是否为待处理?
- ruby - How to import Material-Icons in Hyperstack?
- reactjs - 传递容器状态值的替代方法,其中
- javascript - 如何从 HighCharts 中的系列点击事件手动触发 afterSetExtremes 事件
- gcc - 如何解决以下 gem5 构建错误?
- java - 使用堆栈检查括号
- ios - 无论文本长度如何,都可以在文本视图下方对齐按钮