Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Разделить текстовые файлы по именам файлов

Ответить
Настройки темы
CMD/BAT - [решено] Разделить текстовые файлы по именам файлов

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Brety
Дата: 14-11-2017
Я поискал в других темах, но не могу сообразить как их заставить работать так, как мне надо.

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

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

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

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

Отправлено: 07:10, 27-10-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 07:29, 27-10-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: zip test.zip
(7.3 Kb, 3 просмотров)

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

Отправлено: 07:54, 27-10-2017 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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


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

Отправлено: 08:30, 27-10-2017 | #4


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить PM | Цитировать


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

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

Это сообщение посчитали полезным следующие участники:

Отправлено: 12:58, 27-10-2017 | #5


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:47, 27-10-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

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

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

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

Отправлено: 15:20, 27-10-2017 | #7


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить 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
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 18:42, 27-10-2017 | #9


Ветеран


Contributor


Сообщения: 2728
Благодарности: 1697

Профиль | Отправить 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



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Разделить текстовые файлы по именам файлов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход