用于从多个文本文件中提取字符串的批处理文件

时间:2016-01-22 08:40:38

标签: windows batch-file command-line

我有超过一百个像这样格式化的文本文件

    <TITLE> This is the title
    <SUBJECT> This is the subject
    <XTITLE>

我想使用Windows批处理文件提取标题值,例如“这是从每个文本文件到单个输出文件的标题”,还包括找到这些文件的文本文件名。每个文本文件可以有多个标题标签。以下示例输出:

  

这是标题textfile1.txt这是第二个标题textfile1.txt

     

这是第三个标题textfile2.txt

     

这是第四个标题textfile3.txt

任何?

3 个答案:

答案 0 :(得分:2)

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "delims=" %%i IN ('dir /b/a-d "%sourcedir%\*.txt"') DO (
 FOR /f "usebackqtokens=1-3delims=<=>" %%a IN ("%sourcedir%\%%i") DO (
  IF "%%b"=="TITLE" ECHO(%%i %%c
  IF "%%a"=="TITLE" ECHO(%%i %%b
 )
)
)>"%outfile%"

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

生成定义为%outfile%

的文件

如果没有前导空格,则会调用if...%%a行;如果有前导空格,则会调用if...%%b

我改变了报告字段的顺序,因为这似乎对我更有意义。如果您确实希望报告的顺序相反,只需撤消%%i语句中的%%a/%%becho

此例程为每个输入文件生成一行。

@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "delims=" %%i IN ('dir /s/b/a-d "%sourcedir%\*.txt"') DO (
 FOR /f "usebackqtokens=1-3delims=<=>" %%a IN ("%%i") DO (
  IF "%%b"=="TITLE" ECHO(%%i %%c
  IF "%%a"=="TITLE" ECHO(%%i %%b
 )
)
)>"%outfile%"

GOTO :EOF

调整相同的例程以包括子目录的扫描。请注意,在这种情况下,dir /s /b包含商品详情中的路径。

如果路径/文件名中包含分隔符,您可能希望将echo ed %%i放在引号中。

答案 1 :(得分:1)

@echo off
pushd "c:\folder_with_files"
for %%# in (textfile*.txt) do (

  for /f "tokens=1* delims=>" %%a in ('find "<SUBJECT>" "%%#"') do (
    if "%%b" neq "" (
        echo %%b : file %%#
    )
  )
)>>"c:\output.txt"

您可能需要在第一个for循环中更改文件的掩码,并且需要更改PUSHD位置

答案 2 :(得分:0)

此方法应该运行得更快,特别是如果文件很大:

@echo off
setlocal EnableDelayedExpansion

rem Group titles of same files in same array elements
for /F "tokens=1,3 delims=:>" %%a in ('findstr /L "<TITLE>" *.txt') do (
   set "t[%%a]=!t[%%a]!  %%b"
)

rem Show the titles
(for /F "tokens=2,3 delims=[]=" %%a in ('set t[') do echo %%~Fa: %%b) > output.txt

例如,使用这些输入文件:

<强> textfile1.txt

    <TITLE> This is the title
    <SUBJECT> This is the subject
    <XTITLE>

    <TITLE> This is the second title
    <SUBJECT> This is the subject
    <XTITLE>

<强> textfile2.txt

    <TITLE> This is the third title
    <SUBJECT> This is the subject
    <XTITLE>

<强> textfile3.txt

    <TITLE> Fourth title
    <SUBJECT> This is the subject
    <XTITLE>

    <TITLE> Fifth title
    <SUBJECT> This is the subject
    <XTITLE>

    <TITLE> Sixth title
    <SUBJECT> This is the subject
    <XTITLE>

这是输出:

C:\Folder\textfile1.txt:    This is the title   This is the second title
C:\Folder\textfile2.txt:    This is the third title
C:\Folder\textfile3.txt:    Fourth title   Fifth title   Sixth title