Пакетно найти строку (содержится в textlist.txt) в других файлах .txt в каталоге и скопировать значение из .txt в новый - PullRequest
0 голосов
/ 23 января 2012

проблема с поиском пакета для поиска и копирования строк, перечисленных в textlist.txt, из текстовых файлов. Можно ли сделать пакет, который должен найти все значения (из текстового списка) в текстовых файлах в каталоге и скопировать все эти значения в новый файл. У меня есть каталог с:

textlist.txt содержит:

  • 3010
  • 3020
  • 3030 ....

и другие каталоги с текстовыми файлами:

3010.txt содержит разделенную вкладку, например:

  • 3010 a1
  • 3011 b1
  • 3012 с1 ....

3020.txt содержит, например:

  • 3020 а4
  • 3021 b3
  • 3022 г5 ....

3030.txt содержит, например:

  • 3030 ч5 г7
  • 3031 f2
  • 3032 т4 ....

и другие 3040.txt, 3050.txt и т. Д.

Мне нужен такой текстовый файл результата.

  • 3010 a1 {эта строка берется из 3010.txt, но возможно, что ее можно найти в другом текстовом файле.}
  • 3020 a4 {эта строка берется из 3010.txt, но возможно, что ее можно найти в другом текстовом файле.}
  • 3030 h5 g7 {эта строка берется из 3010.txt, но, возможно, ее можно найти в другом текстовом файле.}

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 25 января 2012

Следующее создаст файл, содержащий совпадения во всех файлах для всех строк ввода:

@ECHO OFF
>results.txt (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    FIND "%%i" files\*.txt | FINDSTR /v "^---- ^$"
  )
)

Это работает так:

  • FINDпринимает входную строку, ищет ее в указанных файлах и печатает результаты, которые передаются в FINDSTR.

  • FINDSTR, устраняет «шум», создаваемый FIND (пустые строки и строки, такие как ------ filename.txt) и выводит остальные.

  • Анализируемый результат выводится на стандартный вывод , который перенаправляется на results.txt длявесь цикл.

Если, согласно вашему комментарию, вам необходимо дополнительно создать еще один файл, содержащий строки, которые не имеют совпадений, вы можете изменить приведенный выше скрипт следующим образом:

@ECHO OFF
>results.txt <b>2>notinfile.txt</b> (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    <b>(</b>FIND "%%i" files\*.txt <b>|| (ECHO %%i) 1>&2)</b> | FINDSTR /v "^---- ^$"
  )
)

Логика в основном такая же, за исключением случаев, когда FIND не получает совпадений для входной строки.В этом случае поисковый термин печатается со стандартной ошибкой (ECHO … 1>&2).Стандартный вывод FIND все еще передается по каналу FINDSTR, и, поскольку он содержит только шум, в этом случае FINDSTR ничего не дает.

Итак, цикл выдает результатыкак на стандартном выходе, так и на стандартной ошибке, каждый раз в зависимости от результата FIND.Стандартный вывод перенаправляется на results.txt, как и в предыдущей версии, а стандартная ошибка перенаправляется на notinfile.txt.

ОБНОВЛЕНИЕ

Второй сценарий имеетУ вас есть крошечный недостаток, который может или не может быть серьезным в вашей ситуации, в зависимости от того, как вы собираетесь использовать файл notinfile.txt.Недостаток заключается в добавлении дополнительного пробела в конец каждого значения, которое идет к notinfile.txt.

Будь то ошибка или какой-либо артефакт, я не знаю, но я выяснил,что если я сохраню результаты FIND во временном файле и позже загружу их из него в FINDSTR, дополнительное пространство не будет создано.Я не мог найти какой-либо другой способ исправить проблему с дополнительным пространством, поэтому вот измененная версия:

@ECHO OFF
>results.txt 2>notinfile.txt (
  FOR /F "delims=" %%i IN (textlist.txt) DO (
    FIND "%%i" files\*.txt <b>>tmpResults</b> || (ECHO %%i) 1>&2
    FINDSTR /v "^---- ^$" <b><tmpResults</b>
  )
)
DEL tmpResults 2>NUL

ОБНОВЛЕНИЕ 2 (после дополнительных комментариев)

Сзначения в файлах разделены табуляцией, вы можете включить разделитель в строку поиска сразу после искомого термина, чтобы предотвратить сопоставление aaa с, например, aaa/bbb.Поэтому вместо

FIND "%%i"

у вас будет

FIND "%%i   "

, где широкий пробел после %%i является символом табуляции.

И я также хотел бы предложитьальтернативная версия команды FINDSTR.Поскольку вы ищете только один термин, вы можете изменить это:

FINDSTR /v "^---- ^$"

на просто:

FINDSTR "%%i"
0 голосов
/ 24 января 2012

Используйте команду FOR для выполнения команды для каждой строки в файле (с ключом / F).Используйте НАЙТИ для поиска файлов.Вот пример, который демонстрирует их использование.

FIND сообщает о совпадениях, но также добавляет строку, начинающуюся с «----», чтобы показать, в каком файле найдено совпадение. Именно поэтому первый FOR создает дамп временного файла.Второй for обрабатывает в качестве комментариев любую строку, начинающуюся с «-», и, таким образом, отфильтровывает эту информацию из FIND.Если вы запустите пакет более одного раза, он удалит любой предыдущий файл results.txt.

Важно, чтобы файл textlist.txt НЕ находился в той же папке, что и папка поиска, иначе его содержимое будет включенов результатах.

@echo off
setlocal
set searchFolder=C:\theFolder

del tempResults.txt >nul 2>nul
del results.txt >nul 2>nul

for /F "delims=" %%i in (textlist.txt) do find "%%i" %searchFolder%\*.txt >> tempResults.txt
for /F "delims=" "eol=-" %%i in (tempResults.txt) do echo %%i >>results.txt
del tempResults.txt >nul 2>nul

endlocal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...