Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Разделить текстовые файлы по именам файлов (http://forum.oszone.net/showthread.php?t=330805)

Brety 27-10-2017 07:10 2773628

[решено] Разделить текстовые файлы по именам файлов
 
Я поискал в других темах, но не могу сообразить как их заставить работать так, как мне надо.

Хотелось бы найти способ разделения одного файла на несколько используя именно bat/cmd.
Я использовал код "соединителя" из этой темы, но код разделителя не работает до конца, плюс разбивает некоторые линии на новые строки в произвольных местах, чего мне совсем не надо.

Смысл в том, что файлы соединяются в один, и начало каждого следующего файла помечено как [название_файла.txt],после чего идёт сам текст файла. Мне теперь надо этот файл разделить обратно, что бы [название_файла.txt] становилось именем файла, и содержало весь текст который идёт до следующего [название_другого_файла.txt].
Например.

Код:

[Название001.txt]
{
"дата":[далее идёт код произвольной длинны с использованием {["(.,:,.)"]} и прочих
символов/букв/цифр.
]
}

[Название100.txt]
{
"дата":[далее идёт код произвольной длинны с использованием {["(.,:,.)"]} и прочих
символов/букв/цифр.
]
}

Соответственно в оригинале файл начинается с { и заканчивается }.

Iska 27-10-2017 07:29 2773629

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

Brety 27-10-2017 07:54 2773631

Вложений: 1
Ну вот например. Из 13 соединённых файлов получается 11 разъединённых. Собственно, даже если соединить 2 файла, а потом разъединить, то второй файл будет оборван на каком-то моменте. Плюс разбивка на новые строки в произвольных местах.

Iska 27-10-2017 08:30 2773634

Brety, ну, начнём с того, что у Ваших файлов концы строк в формате Unix — 0x0A, оно же Lf или LineFeed. Используя вывод в пакетных файлах, Вы уже в объединённом файле получаете концы строк не в виде Lf, а, как и принято в мире DOS/Windows — в виде пар CrLf. Не знаю, насколько это критично для Вас, но оригинальные файлы Вы таким способом уже не получите.

Далее. «разбивка на новые строки в произвольных местах» — совсем не в произвольных, а строго по длине в 1024 символа.


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

megaloman 27-10-2017 12:58 2773719

Цитата:

Цитата Brety
Хотелось бы найти способ разделения одного файла на несколько используя именно bat/cmd.

Это обусловлено чем-то серьезным, или это каприз? Возиться с текстом в файле со всякими символами в cmd, имхо, затея достаточно рискованная. Как вариант, vbs или js скрипт.

Brety 27-10-2017 14:47 2773753

Цитата:

Цитата megaloman
Это обусловлено чем-то серьезным, или это каприз?»

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

Iska 27-10-2017 15:20 2773763

Brety, «в любой ситуации» — такого не бывает в принципе, «на любой винде» — это как раз WSH.

Цитата:

Цитата Brety
Я думал для спецов это было бы как два пальца, »

Обработка файлов посредством пакетных файлов сродни починке микросхемы при помощи стамески и молотка. Слишком грубый и ненадёжный инструмент.

Цитата:

Цитата Brety
поскольку текст в файле вроде как имел более-менее чёткое обозначение начала и конца, и раз уж тот предыдущий разделитель хоть как-то но срабатывал. »

Какой «тот предыдущий»? В той теме, на которую Вы ссылаетесь, я cделал обработчики на PowerShell.

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

Brety 27-10-2017 18:34 2773805

Цитата:

Цитата Iska
Какой «тот предыдущий»? »

Который этот.

Код:

@echo off
 
set "result=outfile.txt"
 
for /f %%i in ('^<"%result%" find/c /v ""') do <"%result%" (
 for /l %%j in (1 1 %%i) do @(
  set "x="
  set/p x=
  if defined x (
  (
  for /f "delims=" %%k in ('
    cmd/v/c if "!x!" equ "[!x:~1,-1!]" echo "!x:~1,-1!"
  ') do @(
    2>nul md "%%~dpk"
    rem:>"%%k"
    set y=%%k
  )
  )|| if defined y cmd/v/c ">>!y! echo.!x!"
  ) else if defined y cmd/v/c ">>!y! echo."
 )
)
 
exit/b 0

Цитата:

Цитата Iska
Выше я Вам уже указал, что фокус с пакетными файлами тупо не прокатит, поскольку в оригинале совсем другие концы строк, »

Насколько я сейчас заметил, похоже это ни на что в конечном итоге не влияет, если сам код от { и до } остаётся целым.

Iska 27-10-2017 18:42 2773809

Цитата:

Цитата Brety
Насколько я сейчас заметил, похоже это ни на что в конечном итоге не влияет, если сам код от { и до } остаётся целым. »

Вы везучий.

megaloman 27-10-2017 23:24 2773860

Brety,
Вот батник со встроенным js-скриптом, который умеет консолидировать файлы в указанной папке и разделять консолидированный файл
Код:

@set @E=1; /*

@Echo Off
cls

Set "FileIn=Z:\Box_In\*.txt"
Set "FileOut=Z:\Box_In\Rezult.txt"

Echo ------------------------------
Echo Press:1 for Consolidation "%FileIn%"
Echo Press:2 for Separation "%FileOut%"

Set /P X=Press:
If Not "%X%"=="1" If Not "%X%"=="2" (
        Echo !!! Option "%X%" not defined
        Echo Script %~dpnx0 canceled
        Echo ------------------------------
        Pause
        GoTo :Eof
)
If %X%==1 Call :Consolidate "%FileIn%" "%FileOut%"
If %X%==2 Call :Separate "%FileIn%" "%FileOut%"
GoTo :Eof

:Consolidate
rem        GoTo :Continue
        If Exist "%~2" (
                Echo !!! File "%~2" already exists
                Echo Script %~dpnx0 canceled
                Pause
                GoTo :Eof
        )
        :Continue

        rem ------------------------------ Backup input files
        Set "DateTime=%Date%-%Time%"
        Set "DateTime=%DateTime: =0%"
        Set "DateTime=%DateTime::=%"
        Set "DateTime=%DateTime:/=%"
        Set "DateTime=%DateTime:,=%"
        "C:\Program Files\7-Zip\7z.exe" a "%~2-%DateTime%.7Z" "%~1"
        rem ------------------------------

        <Nul Set /P X=>"%~2"
 
        FOR %%f IN ("%~1") DO If /I Not "%%f"=="%~2" (
                >"%~2.tmp.tmp" (Echo ==========%%~nxf==========)
                Copy "%~2"+"%~2.tmp.tmp"+"%%f" "%~2.tmp" /B /Y >Nul && (
                        Del "%%f" >nul
                        Move /Y "%~2.tmp" "%~2" >Nul
                )
        )
        Del "%~2.tmp.tmp" >Nul 2>&1
        Del "%~2.tmp" >Nul 2>&1
GoTo :Eof

:Separate
        Set "$InFile=%~dpnx2"
        Set "$InFile=%$InFile:\=\\%"
        Set "$OutPath=%~dp1"
        Set "$OutPath=%$OutPath:\=\\%"
        cscript //NoLogo /E:jscript "%~dpnx0" "%$InFile%" "%$OutPath%"
GoTo :Eof
*/
var oArg=WScript.Arguments;       
if (oArg.Count()>1) {
        WScript.Echo(oArg(0),'\t',oArg(1));
        var FileTxt=oArg(0);
        var PathOut=oArg(1);

        var Txt,err,nlen,i;

        var FSO=WScript.CreateObject("Scripting.FileSystemObject");
        try {Txt=FSO.OpenTextFile(FileTxt);}
        catch (err) {
                if (err != 0) {
                        WScript.Echo("Open file "+FileTxt+"\nerror: "+err.number+"\n"+err.description);
                        WScript.Quit();
                }
        }
        var strContent = Txt.ReadAll();
        Txt.Close();
        var OutMass = strContent.split('==========');

        for (var i = 2; i < OutMass.length; i=i+2) {
                WScript.Echo(PathOut+OutMass[i-1]);
                Txt=FSO.CreateTextFile(PathOut+OutMass[i-1],true);
                Txt.Write(OutMass[i].substr(2));
                Txt.Close();
        }
}
else {WScript.Echo('using script \n======== \n\n'+'cscript.exe //nologo "scriptname.js" "input text" >"outputfile.txt"');}


Если запустить консолидацию файлов а затем без изменения разбиение на файлы, длина файлов будет равна исходной.
Перед консолидацией делается страховочный архив посредством архиватора 7z.
При консолидации исходные файлы удаляются.
Пропишите свои пути.
Если пропИшите:
Set "FileIn=*.txt"
Set "FileOut=Rezult.txt"
то батник должен располагаться в папке с файлами.
Цитата:

Цитата Brety
Я думал для спецов это было бы как два пальца »

Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение.

Brety 14-11-2017 01:14 2777358

megaloman

Пробовал и так и сяк, похоже что работает как надо. Спасибо.


Время: 02:23.

Время: 02:23.
© OSzone.net 2001-