2013-04-18 2 views
1

Мне нужно прочитать в имени файла из каждой подпапки, найти строку, которую я ищу, а затем записать в текстовый файл. Имя файла из каждой подпапки всегда одинаково.DOS Чтение, разбор, а затем запись в файл

EDIT: Что касается структуры данных файла ... это файлы XML с TAGS в них. Я просто хочу найти эти теги ниже и записать их в текстовый файл.

Вот фрагмент для данных (есть несколько тегов трека ж/в файле:.

   <track> 
       <artists> 
       <artist> 
        </read_only_info> 
        <primary>true</primary> 
        <language>en</language> 
        <artist_name>Kim Wilde</artist_name> 
        <roles> 
         <role>Primary</role> 
        </roles> 
       </artist> 
      </artists> 
      <isrc>USMC18441630</isrc> 
      </audio_file> 
      <title>The Second Time</title> 
      <locales/> 
      <track_number>8</track_number> 
     </track> 

Я использую «найти», чтобы искать строку Это то, что у меня есть ...

@ECHO OFF 


SET filename=metadata.txt 

FOR /F %%D in ('dir /b /a:D') DO (

(find /i "<artist_name>" "%%D\%filename%") 
(find /i "<title>" "%%D\%filename%") 
(find /i "<track_number>" "%%D\%filename%") 

) 

Как назначить переменные для «ARTIST_NAME», «название» и «track_number», то эхо/печать каждой переменной в файл, так что результат выглядит

ARTIST_NAME, название, track_number (запятая DELIM например,)

Заранее благодарен!

+0

Вашего объяснения insuffizient. Не иметь понятия о вашей структуре данных. – Endoro

+0

Вы должны показать гораздо больше своего xml, чтобы мы могли видеть TOKENS. – Endoro

ответ

0
@ECHO OFF 
SETLOCAL 
SET filename=metadata.xml 

(
FOR /F %%D in ('dir /b /a:D') DO IF EXIST "%%D\%filename%" (
CALL :process "%%D\%filename%" 
) 
)>result.txt 
GOTO :eof 

:process 
CALL :filter %1 art artist_name 
CALL :filter %1 titl title 
CALL :filter %1 trak track_number 
ECHO "%art%","%titl%","%trak%" 
GOTO :eof 

:filter 
FOR /f "delims=" %%i IN ('type %1 ^|findstr /c:"<%3>"') DO (SET %2=%%i) 
CALL SET "%2=%%%2:*%3=%%" 
CALL SET "%2$=%%%2:*/%3=%%xx%3" 
CALL SET "%2=%%%2:~1%%" 
:lop 
CALL SET "%2=%%%2:~0,-1%%" 
CALL SET "%2$=%%%2$:~1%%"&IF DEFINED %2$ GOTO lop 
GOTO :eof 

ПОЛНОСТЬЮ ЗАМЕНИТЬ код 20130423-0805Z

Оказавшись в ловушке замедленного расширения.

Запуск в моей тестовой системе насчитывает более 300 подкаталогов. Упрощение и передача не совсем работа ...

На этот раз наверняка ...

убедитесь, что файл существует в подкаталоге.

фильтр из файла в (арт TITL Трак) содержимое между тегами (ARTIST_NAME название track_number) отображения результатов

  • результаты перенаправляются в выходной файл 'result.txt'

Подпрограмма :FILTER ищет строку, представленную в качестве третьего аргумента («тег»), до :FILTER, в пределах < .. > и присваивает результат переменной, заданной вторым аргументом :filter («var»)

  • VAR затем присваивается% вар: * тег =%, что полоски все до конца строки тега из ВДПА
  • Затем VAR $ присваиваются% вар: */тег% xxtag который все следующие /тег (в случае, если больше данных следует/тег) + тег снова +- символы (хй =/и <)
  • Ведущее «>», затем удаляются из ВДПА
  • персонажа затем отваливается от конца VAR и VAR $ (который будет инициализирован «anystraydataattheendoftclosetagxxtag»), пока VAR $ не будет пустым, wh ich удаляет тег close и любые дополнительные данные.


Ah- несколько данных трека в файл.

>report.txt просто отправляет результаты в файл, а не на экран. Целесообразно полностью

@ECHO OFF 
SETLOCAL 
SET filename=%1&IF NOT DEFINED filename ECHO syntax:%~n0 startingdirname&GOTO :EOF 
PUSHD "%~1" 
SET filename=metadata.xml 

(
FOR /F %%D in ('dir /b /a:D') DO IF EXIST "%%D\%filename%" (
SET skipto=1 
CALL :process "%%D\%filename%" 
) 
)>report.txt 
POPD 
GOTO :eof 

:process 
FOR %%i IN (art titl trak) DO SET "%%i=" 
CALL :filter %1 art artist_name 
IF NOT DEFINED art GOTO :eof 
CALL :filter %1 titl title 
CALL :filter %1 trak track_number 
ECHO "%art%","%titl%","%trak%" 
GOTO process 

:filter 
FOR /f "skip=%skipto% delims=" %%i IN (
    'type %1^|FINDSTR /n "$"') DO if not defined %2 (
    ECHO "%%i"|findstr /c:"<%3>" >nul 
    IF NOT ERRORLEVEL 1 (
    SET "%2=%%i" 
    FOR /f "delims=:" %%L IN ("%%~i") DO SET skipto=%%L 
    ) 
) 
) 
IF NOT DEFINED %2 GOTO :EOF 
CALL SET "%2=%%%2:*%3=%%" 
CALL SET "%2$=%%%2:*/%3=%%xx%3" 
CALL SET "%2=%%%2:~1%%" 
:lop 
CALL SET "%2=%%%2:~0,-1%%" 
CALL SET "%2$=%%%2$:~1%%"&IF DEFINED %2$ GOTO lop 
GOTO :eof 

Исправленная версия.

обрабатывает каждый файл найден в :process после установки - явные переменные, которые будут использоваться - попытаться найти ART с помощью тега - если найден, повторите с titl и trak, выход и повторите попытку. - если не найден, выйдите и перейдите к следующему файлу.

Процедура FILTER - просматривает каждую строку в источнике, но сначала номера каждой строки с linenumber:. Первые строки %skipto% пропускаются. - находит первую строку после пропущенных строк, которая содержит целевой тег - устанавливает переменную в содержимое всей пронумерованной строки и затем захватывает часть пронумерованной строки до, но не включает первый двоеточие, и помещает эту в SKIPTO - другие совпадающие строки игнорируются, поскольку теперь определена переменная.

Если переменная не была установлена ​​в подпрограмме, то после строки skipto дополнительных элементов данных нет, иначе, когда мы посмотрим на файл, мы знаем, что мы обработали до строки skipto, поэтому следующая переменная будет назначена следующему элементу данных, пропуская все ранее найденные элементы.

(редактировать 20130425-1640Z Добавлен PUSHD/POPD изменить целевые относительный корень)

+0

Питер, спасибо за быстрый ответ. Вы правильно относитесь к данным. Это текстовый файл с «тегами» в них. Когда я запускаю этот скрипт, я вижу следующее в подсказке DOS: «", "", "" Так что это говорит мне, что он не ищет правильное совпадение. Я подтвердил, что значение «%% D \% filename%» верное, так как оно возвращает патч + имя файла. Однако, когда я пытаюсь повторить% tag%, я ничего не получаю. – graffixx

+0

Когда пытаться сделать «эхо-арт -% art%» после первого цикла FOR (перед вызовом функции show, он ничего не возвращает). – graffixx

+0

Хорошая коллекция процентов :) – Endoro

Смежные вопросы