tcl - 从 TCL 中的文本文件中获取单列矩阵
问题描述
我是 TCL 语言的新手,想知道如何执行以下过程。假设我有一个程序每次运行都会创建一个文本文件,并且应该运行 10000 次。每次运行都会创建一个名为“OUT.out”的文本文件。我感兴趣的只是一次运行中该 OUT.out 文件中特定列中的单个数字。
单次运行的理想情况应如下所示:
- 开始主运行,(应该重复10000次,假设)
- 运行案例 1
- 完成案例 1
- 打开文本文件 OUT.out。
- 在文本文件的第 4 列中找到最大绝对值。
- 将最大值保存在第 1 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件 OUT.out。
- 运行案例 2
- 完成主循环的Case 2
- 打开文本文件 OUT.out。
- 在文本文件的第 4 列中找到最大绝对值。
- 将最大值保存在第 2 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件 OUT.out。
- 运行案例 3
- 完成主循环的Case 3
- 打开文本文件 OUT.out。
- 在文本文件的第 4 列中找到最大绝对值。
- 将最大值保存在第 3 行的单独文本文件中。
- 删除 OUT.out 文件
- 打开文本文件 OUT.out。
- 运行案例 4。. .
我认为代码应该缩短我的笔记。在此先感谢您的帮助。
解决方案
根据分隔符是什么,您可以执行以下操作:
# Read in the data and list-ify it; REAL data is often messier though
set f [open OUT.out]
set table [lmap row [split [read $f] "\n"] {split $row}]
close $f
# Kill that unwanted file
file delete OUT.out
# Tcl indexes start at 0
set col4abs [lmap row $table {
expr { abs([lindex $row 3]) }
}]
# Get the maximum of a list of values
set maxAbs [tcl::mathfunc::max {*}$col4abs]
# You don't say what file to accumulate maximums in
set f [open accumulate.out "a"]; # IMPORTANT: a == append mode
puts $f $maxAbs
close $f
然后在每次运行后重复。我相信你可以弄清楚如何做到这一点。
但是,如果您经常这样做,您可能应该考虑将结果存储在数据库中;它们比一堆普通文件更适合这种事情。(我可以彻底推荐 SQLite;我们将批量结果数据管理移到其中,大大提高了我们管理事物的能力,这保留了许多相当大的二进制 blob 以及各种可分析的元数据块。)
推荐阅读
- java - 如何修复“项目中的测试源文件夹必须有一个不用于主要资源的输出文件夹”?
- azure-machine-learning-service - AzureML RL 是否支持 PyTorch?
- sql - 在 PostgreSQL 的大表中执行删除查询的最快方法
- c# - 按住修饰键时,所有 WPF 上下文菜单似乎都无法正确处理突出显示的项目
- mysql - Mysql:如何从另一个数据库表更新表结构?
- mysql - Laravel 6 on Migration: SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
- bash - bash脚本将字符串值转换为json然后返回json
- html - 将鼠标悬停在图像上时创建文本覆盖
- r - 为什么 R 错误输出:二进制运算符的非数字参数
- c# - 问答游戏统一问题,当我尝试从用户那里获得答案输入时,没有获得任何结果