2014-08-27 2 views
3

У меня есть 2 строки в файле под названием database.txt. Одна строка содержит вопрос, а следующая строка ниже содержит ответ.Как найти строку в файле и скопировать найденную строку и следующую строку в другой файл?

Например:

<--When did India get it's Independence?--> 
India got it's independence on August 15th, 1947. 

Если пользователь ищет Когда Индия, независимость?, тогда 1-я строка копируется в другой файл с именем result.txt. Но я хочу, чтобы обе строки скопировали, задали вопрос и ответили.

Может кто-нибудь проливает свет здесь?

+0

следующие линии? – npocmaka

+0

Вопрос и ответ являются последовательными. Однако после каждого набора есть пробел. В каждом наборе есть вопросительный тег и ответ, как указано выше. – blah

+0

Я отредактировал ваш вопрос для ясности. Если вы не согласны, откажитесь от редактирования. – indiv

ответ

3

Раздел справки What topics can I ask about here? должен быть всегда прочитан первым, прежде чем оставлять вопрос. Сообщество Stack Overflow не предназначено для выполнения всего задания программирования для других. Похоже, вы не приложили никаких усилий для кодирования командного файла для своей задачи самостоятельно.

Но вам повезло, поскольку мне было интересно найти 1 или более строк в текстовом файле и скопировать найденные строки, а также одну или несколько строк под каждой найденной строкой в ​​другой текстовый файл, используя только стандартные команды и приложений Windows.

Обычно я выполняю такие задачи с помощью текстового редактора UltraEdit с его мощным движком регулярных выражений Perl и поддержкой сценариев и никогда бы не пришел к идее использовать командный файл для захвата строк из текстового файла и сохранения их в другом текстовом файле ,

Это общее командное решение с пояснительными комментариями для копирования найденных строк и от 2 до N (см. LineCount) последовательные строки под каждой найденной строкой из одного текстового файла в другой текстовый файл.

@echo off 
setlocal EnableDelayedExpansion 

rem Define the regular expression search string. 
set "SearchExpression=When.*India.*Independence" 

rem Define names of input and output file with full path. 
set "ResultFile=C:\Temp\Result.txt" 
set "SourceFile=C:\Temp\Example.txt" 

rem Delete existing output file from a previous execution. 
if exist "%ResultFile%" del "%ResultFile%" 

rem Run a regular expression search in input file using standard Windows 
rem console application FINDSTR with getting output also the line number 
rem of the line with a positive match at beginning of the output line 
rem and separated from the found line with a colon. Of interest in this 
rem first loop is only the line number being processed in subroutine. 
for /F "tokens=1 delims=:" %%N in ('%SystemRoot%\System32\findstr.exe /R /N "%SearchExpression%" "%SourceFile%"') do (
    set SkipLines=%%N 
    call :CopyLines 
) 
endlocal 
goto :EOF 

rem Subroutine to copy from input file the line with the positive match 
rem of the regular expression search and also the next line in the file. 
:CopyLines 

rem Determine the number of lines to copy from input file to output file. 
set LineCount=2 
set SkipOption= 

rem Skip all lines above the found line. 
set /A SkipLines-=1 

rem Option skip with value 0 results in a syntax error message. 
rem Therefore define option skip only with a value greater 0. 
if not "%SkipLines%" == "0" set "SkipOption=skip=%SkipLines% " 

rem Copy LineCount lines starting from SkipLines+1 line to output file. 
for /F "usebackq %SkipOption%delims=" %%L in ("%SourceFile%") do (
    echo %%L>>"%ResultFile%" 
    set /A LineCount-=1 
    if "!LineCount!" == "0" goto :EOF 
) 

А вот еще один пакетный файл без комментариев, оптимизированных для копирования только каждой найденной строки и ниже линии от входа до вывода текстового файла.

@echo off 
setlocal EnableDelayedExpansion 
set "SearchExpression=When.*India.*Independence" 
set "ResultFile=C:\Temp\Result.txt" 
set "SourceFile=C:\Temp\Example.txt" 
if exist "%ResultFile%" del "%ResultFile%" 
for /F "tokens=1,2* delims=:" %%N in ('%SystemRoot%\System32\findstr.exe /R /N "%SearchExpression%" "%SourceFile%"') do (
    set SkipLines=%%N 
    echo %%O>>"%ResultFile%" 
    call :CopyNextLine 
) 
endlocal 
goto :EOF 

:CopyNextLine 
for /F "usebackq skip=%SkipLines% delims=" %%L in ("%SourceFile%") do (
    echo %%L>>"%ResultFile%" 
    goto :EOF 
) 
+0

Проблема с этим решением состоит в том, что три условия поиска должны быть в той же последовательности, что и в исходном текстовом файле - например, вы не можете искать 'India' перед' When' – foxidrive

0

Вспомогательный пакетный файл, используемый ниже, использует собственные методы партии и не требует каких-либо загруженных сторонних инструментов.

Поисковые термины могут быть организованы и организованы различными способами, если вы опишете, как это будет использоваться.

@echo off 
type "database.txt" | findrepl "^.*<--(?=.*when)(?=.*india)(?=.*independence).*-->.*$" /o:0:1 /i 
pause 

Это использует вспомогательный командный файл findrepl.bat (по aacini) - скачать с: https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat

Место findrepl.bat в той же папке, что и пакетный файл или на пути.