批量删除文本文件中的一行?

5

我正在苦苦寻找一个简单的DOS批处理文件示例,它可以删除数千个txt文件的第一行,并将该文件保存为原始文件名。在另一个程序执行批处理过程后,我必须将被删除的行(一个由“X,Y,Z”组成的文本字符串)添加到每个文件的开头以进行外部处理。


所以,更明确地说,您想要完成的所有工作就是将这些数千个文本文件的第一行替换为相同的行“X,Y,Z”(或其他内容)。 - adarshr
@adarshr:不,我猜他提到的另一个问题需要删除第一行,然后再重新添加运行。 - Joey
其他软件会在“X,Y,Z”的第一行中出现问题,因此必须将其删除,在“其他软件”完成其任务后再添加回来,考虑到输入文件的数量,这将需要几天时间。幸运的是,我已经成功编写了一个批处理程序来完成这项任务。 - Tom Colson
2个回答

5
您可以使用more +1跳过文件的第一行。然后您可以将其管道传输到一个临时文件中(您不能直接编辑文本文件):
for %x in (*.txt) do (more +1 "%x">tmp & move /y tmp "%x")

之后,您可以使用类似的技术重新添加第一行:

for %x in (*.txt) do ((echo X,Y,Z& type "%x")>tmp & move /y tmp "%x")

如果您在批处理文件中使用这些内容,请记得将 % 符号加倍:

@echo off
for %%x in (*.txt) do (
    more +1 "%%x" >tmp
    move /y tmp "%%x"
)
rem Run your utility here
for %%x in (*.txt) do (
    echo X,Y,Z>tmp
    type "%%x" >>tmp
    move /y tmp "%%x"
)

好的,显然more命令无法处理过大的文件,这让我感到惊讶。一个替代方法应该可以起作用,如果你的文件不包含空行(尽管从我收集的信息来看它看起来像是CSV格式):

for %%x in (*.txt) do (
    for /f "skip=1 delims=" %%l in ("%%x") do (>>tmp echo.%%l)
    move /y tmp "%%x"
)

@echo off 对于每个%%x在(*.txt)中, 执行以下操作: 将“%%x”文件中的内容从第二行开始复制到tmp文件中。 用tmp文件覆盖原始文件。 当我将此代码应用于生产文件时,它会锁死。每个文件的大小在5-20 MB之间。tmp文件增长到2241 kb,然后停止工作。 - Tom Colson
@Tom:我增加了另一种方法,但尚未测试。目前我没有足够的时间来进行彻底的测试。不幸的是,这种方法应该会慢得多。 - Joey
@Joey:我尝试了你的脚本,但是和@Tom一样,我在处理大文件时遇到了问题。然而,你的第二种方法(没有使用more)在我尝试运行它时什么也没做。你有任何想法吗?基本上,我唯一改变的是将第一行中的.txt替换为.csv,因为我想删除每个csv文件的第一行。然而,什么也没发生(如果我查看文件的保存时间,这并没有改变,所以我猜它们没有被打开)。如果你有任何想法,那就太好了。 - Christoph_J

0

这是我的版本。

@echo off

for /f "usebackq delims=" %%f in (`dir /b *.txt`) do (
    echo X, Y, Z>"tmp.txt"
    type "%%f" >> tmp.txt
    move tmp.txt "%%f"
)

for可以很好地迭代文件列表,而无需解析dir的输出(在某些情况下,具有Unicode文件名时可能会失败)。此外,您还错过了删除第一行的步骤。 - Joey
不行!说得太早了!@echo off for %%x in (*.txt) do ( more +1 "%%x" >tmp move /y tmp "%%x" ) - Tom Colson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接