|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Разделить текстовые файлы по именам файлов |
|
|
CMD/BAT - [решено] Разделить текстовые файлы по именам файлов
|
Новый участник Сообщения: 5 |
Я поискал в других темах, но не могу сообразить как их заставить работать так, как мне надо.
Хотелось бы найти способ разделения одного файла на несколько используя именно bat/cmd. Я использовал код "соединителя" из этой темы, но код разделителя не работает до конца, плюс разбивает некоторые линии на новые строки в произвольных местах, чего мне совсем не надо. Смысл в том, что файлы соединяются в один, и начало каждого следующего файла помечено как [название_файла.txt],после чего идёт сам текст файла. Мне теперь надо этот файл разделить обратно, что бы [название_файла.txt] становилось именем файла, и содержало весь текст который идёт до следующего [название_другого_файла.txt]. Например. Соответственно в оригинале файл начинается с { и заканчивается }. |
|
Отправлено: 07:10, 27-10-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Brety, возьмите несколько файлов, при соединении/разъединении которых гарантированно происходит описанное Вами, и упакуйте их в архив, каковой прикрепите к сообщению, либо выложите на обменник.
|
Отправлено: 07:29, 27-10-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Ну вот например. Из 13 соединённых файлов получается 11 разъединённых. Собственно, даже если соединить 2 файла, а потом разъединить, то второй файл будет оборван на каком-то моменте. Плюс разбивка на новые строки в произвольных местах.
|
Отправлено: 07:54, 27-10-2017 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Brety, ну, начнём с того, что у Ваших файлов концы строк в формате Unix — 0x0A, оно же Lf или LineFeed. Используя вывод в пакетных файлах, Вы уже в объединённом файле получаете концы строк не в виде Lf, а, как и принято в мире DOS/Windows — в виде пар CrLf. Не знаю, насколько это критично для Вас, но оригинальные файлы Вы таким способом уже не получите.
Далее. «разбивка на новые строки в произвольных местах» — совсем не в произвольных, а строго по длине в 1024 символа. Смотреть-разбираться, где там что не так в пакетных файлах — не интересно и не продуктивно. Если найдутся заинтересованные в пакетных файлах коллеги — подскажут. |
Отправлено: 08:30, 27-10-2017 | #4 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата Brety:
|
||
------- Отправлено: 12:58, 27-10-2017 | #5 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 14:47, 27-10-2017 | #6 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Brety, «в любой ситуации» — такого не бывает в принципе, «на любой винде» — это как раз WSH.
Цитата Brety:
Цитата Brety:
Выше я Вам уже указал, что фокус с пакетными файлами тупо не прокатит, поскольку в оригинале совсем другие концы строк, которые теряются уже при слиянии. |
||
Отправлено: 15:20, 27-10-2017 | #7 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать Цитата 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:
|
||
Отправлено: 18:34, 27-10-2017 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Brety:
|
|
Отправлено: 18:42, 27-10-2017 | #9 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать 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:
|
|
------- Последний раз редактировалось megaloman, 27-10-2017 в 23:56. Отправлено: 23:24, 27-10-2017 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Перебрать файлы по именам | EricScream | Скриптовые языки администрирования Windows | 1 | 29-08-2017 11:52 | |
CMD/BAT - Как найти текстовые файлы | yaoleg2 | Скриптовые языки администрирования Windows | 7 | 10-01-2013 21:23 | |
Прочие - Текстовые файлы | Bazaroff | Программное обеспечение Windows | 3 | 25-04-2010 21:39 | |
Не открываются текстовые файлы и изображения и к ним создались файлы с расшир. drweb | leda | Лечение систем от вредоносных программ | 1 | 03-10-2009 01:22 | |
Delphi - Текстовые файлы в Delphi | Borislav | Программирование и базы данных | 2 | 11-01-2005 13:18 |
|