2016-01-22 6 views
0

Я более сотни текстовых файлов отформатирован как этотПакетный файл для извлечения строки из нескольких текстовых файлов

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

Я хочу, чтобы извлечь значения заголовка, используя пакетный файл для Windows, например, «Это название» из каждого из этих текстовых файлов в один выходной файл и включает также имя файла текстового файла, в котором они были найдены. Каждый текстовый файл может иметь несколько тегов заголовков. Пример выходных данных ниже:

Это название textfile1.txt Это второе название textfile1.txt

Это третий титул textfile2.txt

Это четвертый титул textfile3.txt

Кто-нибудь?

+0

Я говорю о командной строке Windows. Извините за путаницу – john

ответ

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" 

Вы, возможно, потребуется изменить маску файлов в первый цикл, и вы должны изменить расположение Pushd

+0

Прошу прощения, но как создать выходной файл. Не совсем в программировании – john

+0

@john set '>> somefile.txt' в конце скобок - как в моем редактировании. – npocmaka

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 

Вам нужно будет изменить настройки sourcedir и destdir в соответствии с ваши обстоятельства.

Производит файл, определенный в% выходной_файле%

if...%%a линии будет вызываться, если нет начальных пробелов, то if...%%b, если есть начальные пробела.

Я изменил порядок полей отчета, поскольку это, казалось, имело для меня больше смысла. Если вам действительно нужен отчет в обратном порядке, просто отмените %%i и %%a/%%b в операциях echo.

Эта процедура создает одну строку для каждого входного файла.


@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 в кавычки в случае разделителей в пути/именах файлов.

+0

это отличный маго! как изменить его с имени файла только на полный путь с именем файла? – john

+0

изменить '%% i' в' echo' утверждения '% sourcedir% \ %% i' – Magoo

+0

ok thanks Magoo – john

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> 

текстовый файл3.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 
Смежные вопросы