Regex 如何使用tcl删除文件的特定内容
我对tcl非常陌生,在开始我的项目之前,我正在通过基本的例子来获得一些很好的理解 如果有人能帮助或建议删除文件特定内容的最佳方法,我将不胜感激 在我的例子中,LogData.dat文件中有一些数据,我希望打开此文件删除第3行,同时删除第一列(#Name、#Index、#mspace),然后在进行更改后保存文件 列数可能超过5列,但始终是第一列的#Name、#Index、#mspace需要删除,第3行需要删除 我想知道是否最好先删除第3行(去掉#mspace),然后将单词#Name、#Index与regexp匹配,然后以某种方式删除#NameIndex 我还需要记住,这些文件可能非常大(100mb),并且会有多个文件,所以我需要循环这些文件,直到所有文件都被修改。因此,如果我必须快速读写这么大的文件,就需要避免任何内存问题 如果有人能提供一些帮助或提供一个简单明了的例子,我们将不胜感激 示例(精简版)如下所示Regex 如何使用tcl删除文件的特定内容,regex,tcl,Regex,Tcl,我对tcl非常陌生,在开始我的项目之前,我正在通过基本的例子来获得一些很好的理解 如果有人能帮助或建议删除文件特定内容的最佳方法,我将不胜感激 在我的例子中,LogData.dat文件中有一些数据,我希望打开此文件删除第3行,同时删除第一列(#Name、#Index、#mspace),然后在进行更改后保存文件 列数可能超过5列,但始终是第一列的#Name、#Index、#mspace需要删除,第3行需要删除 我想知道是否最好先删除第3行(去掉#mspace),然后将单词#Name、#Index与
#Name Length Width height Time
#Index m - - s
#mSpace 0 0 0 0
13.4112 0 0 0
13.411177 0 1.8827043e-007 0.001
13.411122 0 1.8827043e-007 0.002
我建议您阅读该文件并将其写入另一个文件,以便更容易遵循您自己的代码。你可以这样做:
# Open file for reading
set input [open "LogData.dat" r]
# Open file for writing
set output [open "newLogData.dat" w]
# This variable will help us know the line number
set ln 0
# Loop through each line of the file
while {[gets $input line] != -1} {
incr ln
if {$ln < 4} {
if {$ln < 3} {
# On lines 1 to 2, split the line on tab, remove the first
# element of the result list and join it back with tabs
set line [join [lreplace [split $line \t] 0 0] \t]
} else {
# Skip line 3 completely
continue
}
}
puts $output $line
}
close $input
close $output
#打开文件进行读取
设置输入[打开“LogData.dat”r]
#打开文件进行写入
设置输出[打开“newLogData.dat”w]
#这个变量将帮助我们知道行号
设置ln0
#循环浏览文件的每一行
而{[gets$input line]!=-1}{
增量ln
如果{$ln<4}{
如果{$ln<3}{
#在第1行到第2行,拆分选项卡上的行,删除第一个
#元素,并使用选项卡将其连接回来
设置行[join[lreplace[split$line\t]0]\t]
}否则{
#完全跳过第3行
持续
}
}
将$output$放入行
}
关闭$input
关闭$output
这里不需要regex,上面是一个示例,其中的文件内容已经包含在一个变量中
您可以放置类似于
文件delete LogData.dat
和文件rename newLogData.dat LogData.dat
的内容来删除初始文件,并使用旧文件名重命名新文件。我将刷Jerry的建议,从一个文件读取,然后写入另一个文件:
set input [open LogData.dat r]
set output [open newLogData.dat w]
字段似乎没有字符分隔,因此split
无法按预期工作。如果每一行都是一个正确的列表,字段中没有空格,这不会导致任何问题
如果第三行在第一个字段中始终包含字符串#mSpace
,而在第一个字段中没有其他行包含该字符串,则不需要计算行数。(更新:修复了if
条件下的愚蠢打字错误,抱歉。)
在输出时,此代码将字段之间的连续空白字符压缩为单个空格字符
chan close $input
chan close $output
这段代码从每行中删除第一个字段,因为这似乎是您所要求的。重读你的问题,现在你似乎只想在前三行中把它去掉更新代码:
# Loop through each line of the file
while {[chan gets $input line] != -1} {
set data [lassign $line first]
if {[string match #* $first]} {
if {$first ne "#mSpace"} {
chan puts $output $data
}
} else {
chan puts $output $line
}
}
文件:
(注意:评论中提到的“Hoodiecrow”是我,我之前用过nick。)tl;dr--请同时显示输入和所需输出。Jerry,感谢您的回复,让它看起来更省力。这正是我想要做的,更多的是让我知道下一步该做什么…谢谢这非常有帮助。嗨Hoodiecrow,谢谢你的回复。你和杰瑞都向我展示了如何以不同的方式编辑文件。非常感谢你。
# Loop through each line of the file
while {[chan gets $input line] != -1} {
set data [lassign $line first]
if {[string match #* $first]} {
if {$first ne "#mSpace"} {
chan puts $output $data
}
} else {
chan puts $output $line
}
}