CMD/BAT - Парсинг txt фала через bat

Аватара пользователя
bifidok1

CMD/BAT - Парсинг txt фала через bat

Сообщение bifidok1 »

Дан файл

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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение megaloman »

Цитата bifidok1:



мне нужно заменить некоторые параметры в нем
CMD/BAT - Парсинг txt фала через bat




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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение bifidok1 »

Да, разделитель должен быть только ;
Аватара пользователя
iglezz

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение iglezz »

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


CMD

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение Serguei Kouzmine »

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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение Serguei Kouzmine »

К сожалению с повершелом совсем не дружу.

Цикл отрабатывает хорошо.
Аватара пользователя
DJ Mogarych

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение DJ Mogarych »

bifidok1, что надо сделать-то, можете словами описать?
Аватара пользователя
megaloman

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение megaloman »

bifidok1,


В меру моего понимания

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение bifidok1 »

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

Дано:

"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

Re: CMD/BAT - Парсинг txt фала через bat

Сообщение DJ Mogarych »

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



Код:

Код: Выделить всё

powershell -command "(gc D:\temp\log.txt -Encoding utf8) -replace 'Выход','2' -replace 'Вход','1' -replace '$','1' -replace '\"' -replace ' ',';' ^|Set-Content D:\temp\log.txt"

А что, надо убирать кавычки и разделять метку времени на две части?
Ответить

Вернуться в «Скриптовые языки администрирования Windows»