2016-12-09 2 views
-2

У меня около 3000 txt-файлов, и я хочу разбить каждый файл на два отдельных файла txt на основе определенной фразы, например, раздела 1 и 2.Сплит много текстовых файлов автоматически

Каждый файл выглядит следующим образом:

Раздел один

XXXXXXXXX XXXXXXXXXX XXXXXXXXX

Раздел два

Xxxxxxxxxc Xxxxccxccc Xxxxxxxcxx

Я хочу иметь раздел O ne и раздел два в двух отдельных файлах txt.

Пожалуйста, предложите или посоветуйте мне любую помощь для выполнения этой задачи. Я слышал о пакетном файле, но я понятия не имею, как это работает.

Я использую окно 10.

Большое спасибо заранее.

+2

Эта задача выполнима с каждой распространенной версии сценария. Но SO - это не сценарий. Вы должны проявить некоторые усилия самостоятельно. Решение Google для решения не так уж сложно. Некоторые подсказки, которые вам нужны для итерации по папке, читайте строку с линейным переключением вывода в следующем разделе. Я vbscript/powershell там другие способы с многострочными RegExes. – LotPings

+0

Если вы можете различать разделы один и два, я бы использовал 'FOR %% a in (* .txt) do findstr" Xxxxxxxxx "" %% a ">>" section1.txt "'. Вы можете сделать что-то подобное снова для раздела 2. Если нет, вернитесь с более подробным вопросом после своей попытки. – soja

ответ

0

Я согласен с предыдущими комментариями. Если вы хотите знать, что происходит, вы должны приложить свои усилия для чтения справки для используемых здесь команд (например, for /?, findstr /?, ...).

Несмотря на вышеизложенное, попробуйте это. Возможно, это потребует модификаций, связанных с обработкой paths, или какими бы ни была ваша настоящая задача. Попробуйте свои усилия, а затем вернитесь, чтобы показать свой прогресс, где вы застряли, и можете найти решение.

Этот скрипта разделить текстовые файлы, где section two найден и меняет расширение с blabla.txt на blabla.one.txt и blabla.two.txt каждый из них, содержащих расщепленные версии исходного файла.

Строки Section ... должны находиться в начале линии.

@echo off 
for /F %%f in ('dir /B *.txt') do (
    for /F "usebackq tokens=1-3 delims=: " %%1 in (`findstr /B /N "Section" "%%f"`) do (
    if /I "%%3" EQU "two" call :split %%f, %%1 
    ) 
) 
exit/B 

:split 
Setlocal 

set "fileone=%~1" & set "filetwo=%~1" & set/a split=%2 

set "fileone=%fileone:.=.one.%" 
set "filetwo=%filetwo:.=.two.%" 

copy NUL "%fileone%">NUL 
copy NUL "%filetwo%">NUL 

for /F "tokens=1,* delims=[]" %%a in ('"type "%~1"|find /N /V """') do (
    if %%a lss %split% ( 
    echo(%%b>>"%fileone%" 
) else ( 
    echo(%%b>>"%filetwo%" 
) 
) 

Endlocal 
exit/B 
+0

Разве ваша партия не рекурсивно не разделила бы и новые файлы? – LotPings

+0

Не думайте, команда '' dir/B * .txt'' в цикле 'for' оценивается до ввода' for' блока. Но если выполнить дважды, то команда 'for' найдет новые файлы. – elzooilogico

0

EDIT ли переделывание моей партии, чтобы получить все файлы и обойти рекурсии уже splittet файлы

@Echo off 
For /f "Delims=" %%F in ('Dir /B/S File*.txt^|Findstr /v "_"' 
) Do Set "Fout=NUL"&Set "Fin=%%~F"&For /f "Tokens=1*Delims=:" %%A in (
'Findstr /N /V §³$ %%F') Do Call:Sub %%B 
Goto :Eof 

:Sub 
If %1. Equ Section. Call :SetFout %Fin% %2 
>>"%Fout%" Echo:%* 
Goto :Eof 

:SetFout 
Set "Fout=%~dpn1_%2%~x1" 
Type NUL>"%Fout%" 

Некоторые объяснения

  • Findstr/N используется для нумерации строк (обязательно в противном случае пустые линии будут удалены)
  • /V §³ $ означает каждую строку NOT, содержащую эти символы, ergo all.
  • для/ф разбирает строку и распилы числа и остаток линии в ARG к вызову: суб
  • если первое слово Section Sub: SetFout называется построить новое имя FOUT из Fin (в файле) путем добавления _secondWord к нему (один, два) новый файл устанавливается в NUL
  • Все остальные строки просто копируются в текущий Fout
Смежные вопросы