我有一个文本文件(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
运行过滤:Findstr
001-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
其他资源:
Where
For /?
For /F
Findstr
- 重定向
|
,<
,>
,2>
, ETC。
Goto :Label
|Call :Label
If condition() else condition()
- DOS - 字符串操作 // dostips.com
- 未记录的变量:
- Windows 命令解释器如何
cmd.exe
解析脚本 - 如何将参数传递给批处理文件 |也适用于函数