无需tcllib实现Tcl修改CSV并同步更新原始版本文件方案咨询
结论
无需额外安装tcllib,使用Tcl原生命令即可实现全部需求,你当前使用的CSV格式规则简单,无转义字符、嵌套逗号等复杂场景,原生字符串处理能力足够覆盖所有操作。
实现思路
- CSV解析:直接按逗号拆分每行内容即可,你当前的CSV首列是空值,拆分后过滤掉空元素就能得到process、AA_version、BB_version三个字段
- 交互逻辑:通过
$argc判断入参数量,无入参时提示用户输入工艺编号,有入参时直接取第一个参数作为目标工艺编号 - 版本存储:用Tcl字典存储所有工艺的版本信息,key为工艺编号,value存储对应AA、BB版本值,查询效率高
- 修改逻辑:
- 确认用户要修改的版本类型(AA/BB)和新版本号
- 读取原始工艺文件全量内容,匹配到对应未注释的旧版本行,开头加
#注释,同时在相邻位置插入新的版本行 - 更新内存中存储的版本字典,按原CSV格式重新写入CSV文件完成同步
完整可运行脚本
把下面代码保存为get_version.tcl,注意修改脚本开头的csv_path和original_file_path为你实际的文件路径:
# 配置项,请替换为你实际的文件路径 set csv_path "version.csv" set original_file_path "your_process_file.txt" # 读取并解析CSV文件 set version_dict [dict create] set f [open $csv_path r] set header [gets $f] # 解析表头,过滤空字段 set header_cols [lsearch -all -inline -not -exact [split $header ,] ""] while {[gets $f line] >= 0} { set cols [lsearch -all -inline -not -exact [split $line ,] ""] if {[llength $cols] != 3} continue lassign $cols process aa_version bb_version dict set version_dict $process [list $aa_version $bb_version] } close $f # 获取目标工艺编号 if {$argc == 0} { puts "请输入要查询的工艺编号:" flush stdout gets stdin target_process } else { set target_process [lindex $argv 0] } # 校验工艺编号是否存在 if {![dict exists $version_dict $target_process]} { puts "错误:未找到工艺编号 $target_process 的版本信息" exit 1 } # 输出当前版本 lassign [dict get $version_dict $target_process] cur_aa cur_bb puts "当前工艺 $target_process 版本信息:" puts "AA_version: `$cur_aa`" puts "BB_version: `$cur_bb`" # 询问是否修改 puts "\n是否需要修改版本信息?(y/n,默认n)" flush stdout gets stdin modify_confirm if {$modify_confirm ne "y"} { exit 0 } # 选择要修改的版本类型 puts "请选择要修改的版本类型:输入AA修改AA_version,输入BB修改BB_version" flush stdout gets stdin modify_type if {$modify_type ni {AA BB}} { puts "错误:只能输入AA或BB" exit 1 } # 输入新版本号 puts "请输入新的版本号:" flush stdout gets stdin new_version if {$new_version eq ""} { puts "错误:版本号不能为空" exit 1 } # 第一步:更新原始工艺文件 set f [open $original_file_path r] set content [split [read $f] \n] close $f set old_version [expr {$modify_type eq "AA" ? $cur_aa : $cur_bb}] set match_line "${modify_type}_version = $old_version" set new_line "${modify_type}_version = $new_version" set new_content [list] set modified 0 foreach line $content { # 匹配到未注释的旧版本行 if {!$modified && [string trim $line] eq $match_line} { # 先加注释的旧行 lappend new_content "#$line" # 再加新行 lappend new_content $new_line set modified 1 } else { lappend new_content $line } } if {!$modified} { puts "警告:原始文件中未找到匹配的旧版本行,已在文件末尾添加新版本行" lappend new_content $new_line } # 写回原始文件 set f [open $original_file_path w] puts $f [join $new_content \n] close $f # 第二步:更新CSV文件 if {$modify_type eq "AA"} { dict set version_dict $target_process [list $new_version $cur_bb] } else { dict set version_dict $target_process [list $cur_aa $new_version] } set f [open $csv_path w] # 写表头 puts $f ",[join $header_cols ,]" # 写所有行 dict for {process versions} $version_dict { lassign $versions aa bb puts $f ",$process,$aa,$bb" } close $f puts "版本修改完成,已同步更新CSV文件和原始工艺文件"
使用说明
- 查询版本:执行
tclsh get_version.tcl,输入工艺编号即可查询对应版本 - 修改版本:执行
tclsh get_version.tcl a11,脚本显示当前版本后按提示输入y确认修改,选择要修改的版本类型、输入新版本号即可完成同步更新
注意事项
- 首次使用前请备份原始工艺文件和CSV文件,避免逻辑误操作导致数据丢失
- 如果有多个原始工艺文件,可修改脚本增加工艺编号和原始文件路径的映射逻辑即可适配
内容的提问来源于stack exchange,提问作者tongtong
相关产品推荐
相关产品推荐

