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

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

bifidok1 29-01-2020 18:18 2907519

Парсинг txt фала через bat
 
Дан файл
D24034CD;28.01.2020 16:59:00;Выход;
D2414664;28.01.2020 17:04:24;Выход;
D2411Ф1B;28.01.2020 17:16:19;Выход;

мне нужно заменить некоторые параметры в нем и заархивировать в 7-zip , у меня получился код
Chcp 1251

@echo off
setlocal enabledelayedexpansion
Set infile=21.txt
Set find="
Set replace=
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP.TXT
)
move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=TMP.TXT
Set find=
Set replace=;
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP1.TXT
)
move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=tmp1.txt
Set find=выход
Set replace=2
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP2.TXT
)
move TMP.TXT

move TMP.TXT
@echo off
setlocal enabledelayedexpansion
Set infile=tmp2.txt
Set find=вход
Set replace=1
setlocal enabledelayedexpansion
set COUNT=0
for /F "tokens=* delims=," %%n in (!infile!) do (
set LINE=%%n
set TMPR=!LINE:%find%=%replace%!
Echo !TMPR!>>TMP3.txt
)
move TMP.TXT

del tmp.txt
del tmp1.txt
del tmp2.txt
7z.exe a -tzip -ssw -mx1 -ppassword -r0 "путь к файлу\TMP3.txt" %DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z

Помогите его оптимизировать, а то получается каждый раз создаю 4 файла(

megaloman 29-01-2020 18:46 2907528

Цитата:

Цитата bifidok1
мне нужно заменить некоторые параметры в нем »

Напишите, что Вы делаете со строками. С каждым из параметров. Разбираться с путанным кодом занудливо. ИМХО, это произведение оптимизировать - только портить :)

iglezz 29-01-2020 23:35 2907561

Несколько замен в одном цикле (и в одном временном файле) можно сделать так:
CMD
Код:

@echo off
chcp 1251 >nul

set infile=test1.txt

set outfile=test1a.txt
del /f /q "%outfile%" >nul 2>&1

set "find1=;"
set "replace1= "

set "find2=:"
set "replace2=_"

set "find3=."
set "replace4=_"

setlocal enabledelayedexpansion

for /F "tokens=* delims=" %%L in (%infile%) do (
set STR=%%L
set NEWSTR=!STR:%find1%=%replace1%!
set NEWSTR=!NEWSTR:%find2%=%replace2%!
set NEWSTR=!NEWSTR:%find3%=%replace3%!
echo !NEWSTR!>>"%outfile%"
)

7z.exe a -tzip test1.zip "%outfile%"


Serguei Kouzmine 30-01-2020 06:54 2907576

bifidok1, не думали использовать для замены опвершел ? он умеет хорошо

bifidok1 30-01-2020 08:14 2907582

К сожалению с повершелом совсем не дружу.
Цикл отрабатывает хорошо.

DJ Mogarych 30-01-2020 08:58 2907584

bifidok1, что надо сделать-то, можете словами описать?

megaloman 30-01-2020 09:21 2907586

bifidok1,
В меру моего понимания
Код:

@Echo Off
cls
>nul chcp 1251
        Set "BoxIn=Z:\Путь к файлу"
        Set "FileIn=Дан файл.txt"

        Set "@R01="="
        Set "@R02= =;"
        Set "@R03=Выход=2"
        Set "@R04=Вход=1"

        Md "%BoxIn%\%~nx0.tmp"

        >"%BoxIn%\%~nx0.tmp\%FileIn%" (FOR /F "usebackq delims=" %%s IN (`2^>nul More "%BoxIn%\%FileIn%"`) Do (
                Set "Str=%%s"
                FOR /F "usebackq tokens=1* delims==" %%q IN (`Set "@R"`) Do Call Set "Str=%%Str:%%r%%"
                Call Echo %%Str%%
        ))

        "C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx1 -ppassword -r0 "%DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z" "%BoxIn%\%~nx0.tmp\%FileIn%"
        Rd /S /Q "%BoxIn%\%~nx0.tmp"
pause
Exit /B 0


bifidok1 30-01-2020 09:23 2907587

Нужно привести файл в нужный формат
Дано:
"D310E3CD";"28.01.2020 16:59:00";"Выход";
"D3114664";"28.01.2020 17:04:24";"Выход";
"D3111B1B";"28.01.2020 17:16:19";"Выход";
"";"28.01.2020 17:16:23";"Выход";
"D310EC09";"28.01.2020 17:30:19";"Выход";
"D310EC00";"28.01.2020 17:30:21";"Выход";
"D3108B4A";"28.01.2020 17:31:44";"Выход";
"D3108B4A";"28.01.2020 17:31:44";"Выход";
"D3108B4A";"28.01.2020 17:31:45";"Вход";
"";"28.01.2020 17:32:16";"Выход";

конечный файл
D310E3CD;28.01.2020;16:59:00;2;1
D3114664;28.01.2020;17:04:24;2;1
D3111B1B;28.01.2020;17:16:19;2;1
;28.01.2020;17:16:23;2;1
D310EC09;28.01.2020;17:30:19;2;1
D310EC00;28.01.2020;17:30:21;2;1
D3108B4A;28.01.2020;17:31:44;1;1
;28.01.2020;17:32:16;2;1


Вход заменяем на 1
Выход заменяем на 2
Добавляем в конец 1

Батник в принципе работает, проблема только как удалить строки у которых нет первого идентификатора, типо такого
;28.01.2020;17:16:23;2;1

DJ Mogarych 30-01-2020 09:37 2907593

Проще всего сделать "батник" через вызов Powershell:
Код:

powershell -command "(gc D:\temp\log.txt -Encoding utf8) -replace 'Выход','2' -replace 'Вход','1' -replace '$','1' -replace '\"' -replace ' ',';' ^|Set-Content D:\temp\log.txt"
А что, надо убирать кавычки и разделять метку времени на две части?

megaloman 30-01-2020 09:56 2907595

Нужно привести файл в нужный формат
Код:

@Echo Off
cls
>nul chcp 1251
        Set "BoxIn=Z:\Путь к файлу"
        Set "FileIn=Нужно привести файл в нужный формат.txt"

        Md "%BoxIn%\%~nx0.tmp"

        >"%BoxIn%\%~nx0.tmp\%FileIn%" (FOR /F "usebackq tokens=1,2,3 delims=;" %%i IN (`2^>nul More "%BoxIn%\%FileIn%"`) Do Call :Out "%%~i" "%%~j" "%%~k")
        "C:\Program Files\7-Zip\7z.exe" a -tzip -ssw -mx1 -ppassword -r0 "%DATE:~0,2%.%DATE:~3,2%.%DATE:~-4%_4800_01.7z" "%BoxIn%\%~nx0.tmp\%FileIn%"
        Rd /S /Q "%BoxIn%\%~nx0.tmp"
pause
Exit /B 0

:Out
        If %1=="" Exit /B 1
        Set "Str=%~2"
        If /I %3=="Выход" Set "Str=%~1;%Str: =;%;2;1"
        If /I %3=="Вход" Set "Str=%~1;%Str: =;%;1;1"
        Echo %Str%
Exit /B


bifidok1 30-01-2020 09:56 2907596

Да, разделитель должен быть только ;

DJ Mogarych 30-01-2020 10:30 2907602

Поправил выше.


Время: 11:36.

Время: 11:36.
© OSzone.net 2001-