Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   разобрать TXT файл на 2 по символу (http://forum.oszone.net/showthread.php?t=335345)

MultiMax 15-06-2018 15:57 2818345

разобрать TXT файл на 2 по символу
 
Добрый день! Имеется текстовый файл song.txt в котором имеется песня :)

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

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

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

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

megaloman 15-06-2018 17:56 2818357

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 2818374

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

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

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

Iska 15-06-2018 20:44 2818377

Цитата:

Цитата MultiMax
Но скрипт обламывается при наличии в песне символа &. »

Одна из причин того, что пакетные файлы — не лучший выбор для решения данной задачи. Вы не могли бы обосновать Ваше:
Цитата:

Цитата MultiMax
Нужен именно bat! »

?

MultiMax 15-06-2018 20:47 2818378

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

alpap 15-06-2018 23:17 2818389

Цитата:

Цитата MultiMax
скачивается из интернета текстовый файл посредством батника »

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

Iska 16-06-2018 00:52 2818395

Цитата:

Цитата MultiMax
на компьютер скачивается из интернета текстовый файл посредством батника »

Покажите полный код существующего пакетного файла.

megaloman 16-06-2018 08:31 2818397

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. Возможно кто-то в этом поможет.


Время: 23:07.

Время: 23:07.
© OSzone.net 2001-