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

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

Ответить
Настройки темы
CMD/BAT - разобрать TXT файл на 2 по символу

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


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

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


Изменения
Автор: MultiMax
Дата: 15-06-2018
Добрый день! Имеется текстовый файл song.txt в котором имеется песня

Филипп Киркоров - Цвет настроения синий

Нужно сохранить в файл artist. txt Филипп Киркоров
в файл title.txt Цвет настроения синий.

То есть до "пробел дефис пробел" и после. Важно разделить не просто по дефису, а по связке " - ". Потому что может быть в песне знак "-" или в имени исполнителя, например "C-Bool". Если в файле просто одно слово. Записать его в artist, title файл сделать пустым.

Может быть есть элегантный вариант? Нужен именно bat!

Отправлено: 15:57, 15-06-2018

 

Ветеран


Contributor


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

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


MultiMax,
Не претендую на элегантность, прямолинейно и без извратов
Код: Выделить весь код
@Echo Off
	Set "FileIn=Z:\Box_In\Artist and song.txt" 
	Set "Sep= - "
	Set "FileOut1=Z:\Box_In\Artist.txt" 
	Set "FileOut2=Z:\Box_In\Song.txt"
 
	Del "%FileOut1%" >nul 2>&1
	Del "%FileOut2%" >nul 2>&1

	FOR /F "usebackq delims=" %%s IN (`2^>nul More "%FileIn%"`) DO Set "S1=%%s" &Call :Separ "%%s" "%%S1:*%Sep%=%%"
GoTo :Eof

:Separ
	Set "Str=%~1"
	Call Set "Str=%%Str:%Sep%%~2=%%"
	If "%~1"=="%~2" (
		>>"%FileOut1%" (Echo %~1)
		>>"%FileOut2%" (Echo:)
	) Else (
		>>"%FileOut1%" (Echo %Str%)
		>>"%FileOut2%" (Echo %~2)
	)
GoTo :Eof

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


Последний раз редактировалось megaloman, 15-06-2018 в 19:05.


Отправлено: 17:56, 15-06-2018 | #2



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

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


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


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

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


Вроде работает! Но скрипт обламывается при наличии в песне символа &. Прекращает обрабатывать строчку

Например "G-Eazy & Halsey - Him & I" - выводится "G-Eazy" "Him"

На песне "Zedd feat. Alessia Cara - Stay (Vladislav-d Remix)" не выводится название песни совсем

Последний раз редактировалось MultiMax, 15-06-2018 в 20:28.


Отправлено: 20:18, 15-06-2018 | #3


Ветеран


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

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


Цитата MultiMax:
Но скрипт обламывается при наличии в песне символа &. »
Одна из причин того, что пакетные файлы — не лучший выбор для решения данной задачи. Вы не могли бы обосновать Ваше:
Цитата MultiMax:
Нужен именно bat! »
?
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:44, 15-06-2018 | #4


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


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

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


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

Отправлено: 20:47, 15-06-2018 | #5


Ветеран


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

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


Цитата MultiMax:
скачивается из интернета текстовый файл посредством батника »
интересно бы посмотреть, да и вообще-то сразу надо так и начинать, показывать что есть и чем надо дополнить или если советуют другой инструмент - привести полностью и детально условия (с примерами, если можно) и отказавшись от предыдущих наработок рассмотреть полностью готовый кем-то любезно предоставленный вариант на более подходящем или удобном или практически единственно возможном инструменте.
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:17, 15-06-2018 | #6


Ветеран


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

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


Цитата MultiMax:
на компьютер скачивается из интернета текстовый файл посредством батника »
Покажите полный код существующего пакетного файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:52, 16-06-2018 | #7


Ветеран


Contributor


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

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


MultiMax, Учитывая содержимое Ваших файлов (наличие по тексту разных неалфавитных символов), ИМХО, Ваша задача в рамках чистого CMD не имеет решения.
Вот в одном командном файле совмещен cmd и js
Код: Выделить весь код
@set @E=1; /*

@Echo Off
	Set "FileIn=Z:\Box_In\Artist and song.txt" 
	Set "Sep= - "
	Set "FileOut1=Z:\Box_In\Artist.txt" 
	Set "FileOut2=Z:\Box_In\Song.txt"

	Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn%" "%Sep%" "%FileOut1%" "%FileOut2%"
GoTo :Eof

*/
var oArg = WScript.Arguments;

var FSO, inF, AllTxt, outF1, outF2, i, str12

FSO=WScript.CreateObject("Scripting.FileSystemObject");

try {inF=FSO.OpenTextFile(oArg(0),1,0)}
	catch (err) {if (err != 0) {WScript.Echo(oArg(0)+" ErrorLevel=2: "+err.description);WScript.Quit(2)}}
	AllTxt=inF.ReadAll().split(String.fromCharCode(13,10));
inF.Close();

outF1 = FSO.CreateTextFile(oArg(2), true, false);
outF2 = FSO.CreateTextFile(oArg(3), true, false);

for (i=0; i<AllTxt.length; i++) {
	str12 = AllTxt[i].replace(oArg(1),String.fromCharCode(13,10)).split(String.fromCharCode(13,10));
	outF1.WriteLine(str12[0]);
	if (str12.length == 1) {outF2.WriteLine("")} else {outF2.WriteLine(str12[1])};
}
outF1.Close();
outF2.Close();
Свой cmd-код поместите между имеющимися /* */
Вызов процедуры разделения файла выделен
Если смириться с тем, что каждая строка в разделённых файлах будет заключена в кавычки, то, возможно, можно ограничиться чистым CMD
Код: Выделить весь код
@Echo Off
	Set "FileIn=Z:\Box_In\Artist and song.txt" 
	Set "Sep= - "
	Set "FileOut1=Z:\Box_In\Artist.txt" 
	Set "FileOut2=Z:\Box_In\Song.txt"
 
	Del "%FileOut1%" >nul 2>&1
	Del "%FileOut2%" >nul 2>&1

	FOR /F "usebackq delims=" %%s IN (`2^>nul More "%FileIn%"`) DO Set "S1=%%s" &Call :Separ "%%S1:%Sep%=" "%%"
GoTo :Eof

:Separ
	>>"%FileOut1%" Echo %1
	If Not "%~2"=="" >>"%FileOut2%" Echo %2
	    If "%~2"=="" >>"%FileOut2%" Echo:
GoTo :Eof
Но всегда можно подобрать данные, способные одурачить любую программу. В данном случае, кавычки в тексте, наверное
Либо, еще вариант, переписать Ваш батник с закачкой полностью в vbs или js. Возможно кто-то в этом поможет.

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


Последний раз редактировалось megaloman, 16-06-2018 в 10:08.

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

Отправлено: 08:31, 16-06-2018 | #8



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование названия файлов из списка по символу в отдельный файл f1rstonlyone@vk Скриптовые языки администрирования Windows 2 07-06-2017 22:08
CMD/BAT - Разбить строку на две подстроки по последнему символу \ kokos76 Скриптовые языки администрирования Windows 2 09-01-2016 09:32
CMD/BAT - [решено] Разобрать большой PDF-файл на отдельные статьи по списку страниц Luzuk Скриптовые языки администрирования Windows 2 15-09-2013 16:42
CMD/BAT - Найти txt файл по имени и заменить содержание файла на мой текст! Fresenius Скриптовые языки администрирования Windows 5 21-11-2012 08:49
CMD/BAT - [решено] Разобрать txt, на строки и назначить каждой переменную campbell Скриптовые языки администрирования Windows 6 26-11-2011 01:32




 
Переход