我有一个csv文件,第一列中包含以下数据
B10114028000D5 0S
C1 00000
D1 0000023426600 000
E1 0000000000
F1
G1
B10119628000D5 0S2
C1 00000
D1 000000000000
E1 0000000000
F1
正如您可以看到的数据模式,每组数据都以B1,C1 ..... G1开始。
我必须只选择所选数据到文本文件中,并且过滤器必须仅应用于 B1 列,必须根据该列选择整个组数据。
在空格必须为 B10119628000D5 之前,过滤器为B1行。 输出文件应为
B10119628000D5 0S2
C1 00000
D1 000000000000
E1 0000000000
F1
什么应该是一个方便的.bat文件?请建议。
答案 0 :(得分:1)
不确定是否需要这样做,但我开发了一些解决方案,允许匹配组在输入文件中多次出现。每个解决方案都会保留匹配组的所有实例。
对于下面的代码,我假设数据位于“input.txt”中,输出将进入“output.txt”
这是一个简单的批处理代码,对纯批处理表现得相当不错:
@echo off
setlocal disableDelayedExpansion
set "print="
(for /f "delims=" %%A in (input.txt) do (
if defined print for /f "delims=1" %%B in ("%%A") do if "%%B" equ "B" set "print="
if not defined print for /f %%B in ("%%A") do if "%%B" equ "B10119628000D5" set print=1
if defined print echo %%A
)) >output.txt
如果文件非常大,上面的内容可能会很慢。
我写了一个hybrid JScript/batch utility called REPL.BAT,可以用来制作一个非常简单的解决方案,非常有效。 REPL.BAT是纯脚本,可以在任何现代Windows机器上从XP开始本地运行。完整的文档嵌入在脚本中。
我使用REPL.BAT将不在“B1”之前的换行符编码为“@”,从而将一组行转换为一行。然后FINDSTR用于仅保留所需的行(匹配“组”),最后的REPL.BAT将“@”解码回换行。如果数据可能包含“@”,则替换数据中不存在的其他一些字符。
type input.txt|repl \n(?!B1) @ m|findstr /bc:"B10119628000D5 "|repl @ \n x >output.txt
如果找不到数据中不存在的字符,则可以通过额外的一轮编码和解码来保护“@”:
type input.txt|repl @ @a|repl \n(?!B1) @n m|findstr /bc:"B10119628000D5 "|repl @n \n x|repl @a @ >output.txt
如果搜索字符串过滤后不需要空格,则根据注释,解决方案将更改如下:
选项1:
@echo off
setlocal enableDelayedExpansion
set "print="
(for /f "delims=" %%A in (input.txt) do (
set "ln=%%A"
if defined print if "!ln:~0,2!" equ "B1" set "print="
if not defined print if "!ln:~0,14!" equ "B10119628000D5" set print=1
if defined print echo %%A
)) >output.txt
选项2:
type input.txt|repl \n(?!B1) @ m|findstr /b B10119628000D5|repl @ \n x >output.txt
选项3:
type input.txt|repl @ @a|repl \n(?!B1) @n m|findstr /b B10119628000D5|repl @n \n x|repl @a @ >output.txt