在 Windows 中使用批处理文件从文本文件中提取特定列中包含特定短语的行

在 Windows 中使用批处理文件从文本文件中提取特定列中包含特定短语的行

我有一个文本文件(epin.txt)有超过200万行。

示例文本:

182060045892569246925460002021    03560000000020000840000000000000ABDRGS00IN0000MMFADT265000 0917 P81 001
182060045892585476932540002021    03560000000100000356000000000000PFTSVS00IN0000MMTHRD285000 0997 P81 001
182071045892585476932540002021    03560000006905000356000000000000DFRTSS00IN0000BPSYFZ865000 0006 P81 001

我只想将第 4、5、6 和 7 列中包含“0600”、“0610”、“0620”的行提取到新的文本文件中。

因此,从样本中只需提取第一行和第二行到新文件中:

182060045892569246925460002021    03560000000020000840000000000000ABDRGS00IN0000MMFADT265000 0917 P81 001
182060045892585476932540002021    03560000000100000356000000000000PFTSVS00IN0000MMTHRD285000 0997 P81 001

我能够使用 Excel 来完成此操作,但文件行数必须少于 100 万行。

然后我尝试使用查找字符串

findstr /B "0600 0610 0620" epin.txt > rf.txt

但这只适用于以 0600 或 0610 或 0620 开头的行;并且仅适用于特定的文件名。

它是否可以稍微改进一下,使其能够从第 N 个字符开始在任何文本/csv/平面文件中查找指定的短语(比如在代码 epin***.txt 中的文件名中使用通配符)?

答案1

尝试进行字符替换(一次一个/列),在Findstr

 String: 1820600
Replace: 182     to: ...0600

并且您可以使用命令.中所需列中所需的搜索来告知您Findstr


findstr /B "...0600 ...0610 ...0620" epin.txt > rf.txt

对于多个文件,我建议使用一些机制进行循环,例如:

for /f ('where current_folder:file.txt + current_folder:file???.txt')do findstr ...

  • 您的代码(在命令行中)看起来像这样:
cd /d "Drive:\Full\Path\To\Files\Folder" & for /f delims^= %i in ('%__AppDir__%Where.exe .:epin.txt .:epin???.txt')do <con: %__AppDir__%Findstr.exe /b "...0600 ...0610 ...0620" "%~i">>rf.txt
  • 您的代码(在 bath 文件中)将如下所示:
@echo off 

cd /d "Drive:\Full\Path\To\Files\Folder"

for /f delims^= %%i in ('%__AppDir__%Where.exe .:epin.txt .:epin???.txt
')do <con: %__AppDir__%Findstr.exe /b "...0600 ...0610 ...0620" "%%~i">>rf.txt

观察1:很抱歉我的英语水平有限,希望你能理解答案/代码。

观察:2我不太明白这部分:

它是否可以稍微改进一下,使其能够从第 N 个字符开始在多个文件 (例如 epin001.txt、epin002.txt 等) 中查找指定的短语?


  • epin???.txt下面是一个建议,它将循环计算文件数量For /F,并在循环中使用数字范围的结果%%~i,从 1 步开始到 1 中的 1 到 中的总数,然后按顺序/范围%%~i运行过滤:Findstr001-00%%~i
@echo off 

Setlocal EnableDelayedExpansion
cd /d "D:\Full\Path\To\Folder\."
>nul 2>&1 del /q /f /a: .\rf.txt

for /f %%i in ('dir /b epin*.txt^|%__AppDir__%Find.exe /v /c ""'
)do for /l %%L in (1 1 %%~i)do set "_n=00%%~L" && call %:^) !_n:~-3!

%:^)
if "%~1"=="" (
    endlocal & goto :eOf ) else 2>nul (
    <con: %__AppDir__%Findstr.exe /b "...0600 ...0610 ...0620" ".\epin%~1.txt" >>rf.txt
    ;exit /b )

考虑到您的最后一条评论以及问题中的最后一次编辑......

是否可以稍微改进一下,让它能够从第 N 个字符开始在任何文本/csv/平面文件中查找指定的短语(比如在代码 epin 中的文件名中使用通配符**。TXT)?*

是的

我建议Findstr在一列内(或从特定列开始)进行搜索,使用相同数量的字符/列中的点,或该形式的一个或多个字符(.*)。

.*因此替换1字符(.)或more字符(*)。

@echo off 

cd /d "D:\Full\Path\To\Folder\."
>nul 2>&1 del /q /f /a: .\rf.txt

set "_my_files=.:*.csv .:*.flat .:epin*.txt"
set "_30th_column=.............................."
set "_find_in_30th=%_30th_column%0600 %_30th_column%0610 %_30th_column%0620"


for /f %%i in ('%__AppDir__%Where.exe %_my_files%
')do <con: %__AppDir__%Findstr.exe /b "%_find_in_30th%" "%~i">>rf.txt


其他资源:


相关内容