我正在开发一个小工具,用于在第一次出现给定分隔符后将文件拆分为2,这样从单个输入文件中,您将获得2个较小的输出文件。
例如,假设您有输入文件内容:
Alpha
Bravo Charlie
Charlie Echo
我使用的分隔符是Charlie
,我怎么能得到一对输出文件,如:
Alpha
Bravo
和
<blank line>
Charlie Echo
我目前正在寻找第一次出现的分隔符字符串,然后在原始文本上执行两次子字符串,在分割文本之前使用分隔符字符串位置,然后将其保存到输出中。然而,虽然我已经成功地找到了如何做子串,但我没有找到关于strpos
类似函数的任何成功。
那么,我该怎么做才能从文本/文件路径的输入块获得类似结果的strpos,或者是否有另一种(更好的?)方法来做我想做的事情?
N.B。我无法使用除Windows Batch Script之外的任何内容,因此,虽然PHP,或Sed,甚至Java,但它不是一个选项
答案 0 :(得分:2)
这是我的解决方案。您可以在_outfile1
和_outfile2
变量中配置输出文件,也可以在_split
中配置拆分令牌。输入文件input.txt
会假定您在问题中说明的内容。
@ECHO OFF
SETLOCAL EnableDelayedExpansion
SET _outfile1=output1.txt
SET _outfile2=output2.txt
SET _split=Charlie
SET OF=!_outfile1!
FOR /F "tokens=*" %%A IN ( input.txt ) DO (
SET TEST=%%A
IF "!OF!"=="!_outfile1!" (
IF "!TEST:%_split%=!"=="%%A" (
ECHO %%A >> !OF!
) ELSE (
ECHO !TEST:%_split%=! >> !OF!
SET OF=!_outfile2!
ECHO. >> !OF!
)
) ELSE (
ECHO %%A >> !OF!
)
)
答案 1 :(得分:2)
很多人都希望使用纯批处理来处理文本文件,实现强大的解决方案非常困难。它通常可以完成,但是在处理大型文件时最终结果可能会非常缓慢,并且它需要神秘的,通常是未记录的构造。
unix世界中有许多工具已移植到可用于解决此问题的窗口,例如sed和awk。最流行的文本处理实用程序使用正则表达式。
我建议您使用JREPL.BAT - a hybrid JScript/batch regular expression text processing utility。 JREPL.BAT是纯粹的脚本,可以在任何Windows机器上从XP开始本地运行,并且几乎与编译的文本实用程序一样快。完整的文档嵌入在脚本中。
解决此特定问题需要一个简单的命令行单行:
jrepl "([\s\S]*?)Charlie([\s\S]*)" "stdout.Write($2);$1" /m /j /f input.txt /o output1.txt >output2.txt
如果在批处理脚本中使用该命令,则应使用CALL JREPL。
工作原理
单个JREPL调用可以方便地写入stdout和文件。
/f input.txt
指定输入文件/o output1.txt
指定应将正常输出写入第一个输出文件>output2.txt
将stdout重定向到第二个输出文件/j
将替换字符串视为JScript表达式/m
(多行模式)将整个输入文件视为单个字符串,允许跨多行搜索。如果您还没有理解正则表达式,我强烈建议您花点时间研究它们。网上有很多教程,它们非常强大。我还建议学习JREPL文档,阅读整篇JREPL DosTips文章。