You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需tcllib实现Tcl修改CSV并同步更新原始版本文件方案咨询

结论

无需额外安装tcllib,使用Tcl原生命令即可实现全部需求,你当前使用的CSV格式规则简单,无转义字符、嵌套逗号等复杂场景,原生字符串处理能力足够覆盖所有操作。

实现思路
  • CSV解析:直接按逗号拆分每行内容即可,你当前的CSV首列是空值,拆分后过滤掉空元素就能得到process、AA_version、BB_version三个字段
  • 交互逻辑:通过$argc判断入参数量,无入参时提示用户输入工艺编号,有入参时直接取第一个参数作为目标工艺编号
  • 版本存储:用Tcl字典存储所有工艺的版本信息,key为工艺编号,value存储对应AA、BB版本值,查询效率高
  • 修改逻辑:
    1. 确认用户要修改的版本类型(AA/BB)和新版本号
    2. 读取原始工艺文件全量内容,匹配到对应未注释的旧版本行,开头加#注释,同时在相邻位置插入新的版本行
    3. 更新内存中存储的版本字典,按原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文件和原始工艺文件"
使用说明
  1. 查询版本:执行tclsh get_version.tcl,输入工艺编号即可查询对应版本
  2. 修改版本:执行tclsh get_version.tcl a11,脚本显示当前版本后按提示输入y确认修改,选择要修改的版本类型、输入新版本号即可完成同步更新
注意事项
  • 首次使用前请备份原始工艺文件和CSV文件,避免逻辑误操作导致数据丢失
  • 如果有多个原始工艺文件,可修改脚本增加工艺编号和原始文件路径的映射逻辑即可适配

内容的提问来源于stack exchange,提问作者tongtong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:36:03