Войти

Показать полную графическую версию : [решено] CMD/BAT - Дополнить строки первой строчкой + добавить 3е значение


spb-nord
21-03-2022, 17:50
Добрый день.
В фирме 10 лет назад был написан парсер на маке. Который стоял на складе и его единственный функционал был в том, чтобы переделывать txt файл в необходимый. Мак сдох =)
Думаю, можно все это сделать через VB но не силен. Подскажите пожалуйста.

Пример 1
Текстовый документ имеет структуру, где первой строчкой идет наименование места а потом идет список из артикулов.
P1-31-00-00
KB920673
KB920674
KB920675
KB920676
KB920677

Парсер подставлял первую строчку за каждой последующей строкой с расстоянием в tab и в конце предлагал ввести значение, которое добавлял еще раз через tab.
Первую строка имела вид после манипуляций - box place client_id ( все тоже через tab)


box place client_id
KQ023239 P1-31-00-00 123
KQ023252 P1-31-00-00 123
KQ023241 P1-31-00-00 123
KQ023249 P1-31-00-00 123
KQ023247 P1-31-00-00 123
KQ023245 P1-31-00-00 123
KQ023243 P1-31-00-00 123
KQ023248 P1-31-00-00 123



Начинаю с малого. На форуме нашел пример подходящий:
Добавляет значение после каждой строчки. Но Set "Str=%~1" не подходит. Как можно указатель, чтобы брал значение из первой строки и присваивал ее и при этом предлагал ввести третье значение.


@echo off
setlocal enableextensions enabledelayedexpansion

set sSourceFile=C:\1\1.txt
set sDestFile=2.txt

if exist "%sSourceFile%" (
>"%sDestFile%" (
for /f "usebackq delims=" %%i in ("%sSourceFile%") do (

echo %%i Set "Str=%~1"
)
)
) else (
echo Can't find source file [%sSourceFile%].
exit /b 1
)

endlocal
exit /b 0

Пример 2.

Строчки которые нужно разбить идут через одну.

P1-17-01-03
KQ021031
P1-16-02-01
KQ002469

На выходе парсер делал первую строчку с заголовком через tab - box place client_id
и чередовал в строчку через одну
Тут не присваивается третье значение. Только 2.
box place client_id
KQ021031 P1-17-01-03
KQ002469 P1-16-02-01

Потом все это загружается в старинную бд.

megaloman
21-03-2022, 18:32
spb-nord, Как-то путано. Вот вариант@Echo Off
cls
Set "FileIn=Z:\Box_In\infile.txt"
Set "FileOut=Z:\Box_In\outfile.txt"

Set "FirstNew=box place client_id"

>"%FileOut%" (Echo %FirstNew%)
Set /P FirstOld=<"%FileIn%"

Echo %FirstNew%
FOR /F "usebackq delims=" %%i In (`2^>nul More +1 "%FileIn%"`) DO (
(Set /P EndStr=%%i %FirstOld% )
>>"%FileOut%" (Call Echo %%i %FirstOld% %%EndStr%%)
)
Pause
Exit /BВопросы по постановке:
1. Откуда берётся "box place client_id" или это некая постоянная?
2. Через "tab" или через пробел? Что такое "tab" - приведите код символа
3. Третье значение - постоянная для всех строк или для каждой строки своя?

spb-nord
21-03-2022, 18:46
Спасибо за ответ.
1. box place client_id это постоянная которая появляется во всех новых файлах.
2. Взято из примера самого файла. Прикрепил.
3. Третье для одного документа постоянная. Для другого может быть 444 к примеру, но так же на весь файл.

megaloman
21-03-2022, 20:17
Попробуйте. Здесь Tab присвоены не пробелы, а табуляция. @Echo Off
cls
Set "FileIn=Z:\Box_In\infile.txt"
Set "FileOut=Z:\Box_In\outfile.txt"

Set "Tab= "
Set "FirstNew=box place%Tab%client_id"
rem Set "FirstNew=box%Tab%place%Tab%client_id"
rem Set "FirstNew=box%Tab%%Tab%place%Tab%%Tab%client_id"

(Set /P EndStr=Enter the third component ^> )

>"%FileOut%" (Echo %FirstNew%)
Set /P FirstOld=<"%FileIn%"

FOR /F "usebackq delims=" %%i In (`2^>nul More +1 "%FileIn%"`) DO (
>>"%FileOut%" (Echo %%i%Tab%%FirstOld%%Tab%%EndStr%)
)
Pause
Exit /BЯ не понимаю, к чему привязан заголовок. Приведенный вариант даётbox place client_id
KB920673 P1-31-00-00 klwhjejhwlqjlkjrlejl
KB920674 P1-31-00-00 klwhjejhwlqjlkjrlejl
KB920675 P1-31-00-00 klwhjejhwlqjlkjrlejl
KB920676 P1-31-00-00 klwhjejhwlqjlkjrlejl
KB920677 P1-31-00-00 klwhjejhwlqjlkjrlejl
Возможно, Вас более устроит строка: Set "FirstNew=box%Tab%place%Tab%client_id"При этом получим как в Вашем файлеbox place client_id
KB920673 P1-31-00-00 868686
KB920674 P1-31-00-00 868686
KB920675 P1-31-00-00 868686
KB920676 P1-31-00-00 868686
KB920677 P1-31-00-00 868686
Или еще вариант Set "FirstNew=box%Tab%%Tab%place%Tab%%Tab%client_id"
box place client_id
KB920673 P1-31-00-00 42321
KB920674 P1-31-00-00 42321
KB920675 P1-31-00-00 42321
KB920676 P1-31-00-00 42321
KB920677 P1-31-00-00 42321

spb-nord
22-03-2022, 11:25
Спасибо огромное! Все супер




© OSzone.net 2001-2012