Войти

Показать полную графическую версию : [решено] Разделить текстовые файлы по именам файлов


Brety
27-10-2017, 07:10
Я поискал в других темах, но не могу сообразить как их заставить работать так, как мне надо.

Хотелось бы найти способ разделения одного файла на несколько используя именно bat/cmd.
Я использовал код "соединителя" из этой темы (http://forum.oszone.net/post-2754665.html), но код разделителя не работает до конца, плюс разбивает некоторые линии на новые строки в произвольных местах, чего мне совсем не надо.

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


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

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

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

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

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

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

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


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

megaloman
27-10-2017, 12:58
Хотелось бы найти способ разделения одного файла на несколько используя именно bat/cmd. Это обусловлено чем-то серьезным, или это каприз? Возиться с текстом в файле со всякими символами в cmd, имхо, затея достаточно рискованная. Как вариант, vbs или js скрипт.

Brety
27-10-2017, 14:47
Это обусловлено чем-то серьезным, или это каприз?»

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

Iska
27-10-2017, 15:20
Brety, «в любой ситуации» — такого не бывает в принципе, «на любой винде» — это как раз WSH.

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

поскольку текст в файле вроде как имел более-менее чёткое обозначение начала и конца, и раз уж тот предыдущий разделитель хоть как-то но срабатывал. »
Какой «тот предыдущий»? В той теме, на которую Вы ссылаетесь, я cделал обработчики на PowerShell.

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

Brety
27-10-2017, 18:34
Какой «тот предыдущий»? »
Который этот.

@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
27-10-2017, 18:42
Насколько я сейчас заметил, похоже это ни на что в конечном итоге не влияет, если сам код от { и до } остаётся целым. »
Вы везучий.

megaloman
27-10-2017, 23:24
Brety, @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
14-11-2017, 01:14
megaloman

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




© OSzone.net 2001-2012