Войти

Показать полную графическую версию : разобрать TXT файл на 2 по символу


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

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

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

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

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

megaloman
15-06-2018, 17:56
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

MultiMax
15-06-2018, 20:18
Вроде работает! Но скрипт обламывается при наличии в песне символа &. Прекращает обрабатывать строчку :(

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

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

Iska
15-06-2018, 20:44
Но скрипт обламывается при наличии в песне символа &. »
Одна из причин того, что пакетные файлы — не лучший выбор для решения данной задачи. Вы не могли бы обосновать Ваше:
Нужен именно bat! »
?

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

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

Iska
16-06-2018, 00:52
на компьютер скачивается из интернета текстовый файл посредством батника »
Покажите полный код существующего пакетного файла.

megaloman
16-06-2018, 08:31
MultiMax, Учитывая содержимое Ваших файлов (наличие по тексту разных неалфавитных символов), ИМХО, Ваша задача в рамках чистого CMD не имеет решения. @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-код поместите между имеющимися /* */
Вызов процедуры разделения файла выделен@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. Возможно кто-то в этом поможет.




© OSzone.net 2001-2012