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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] CMD/BAT - Дополнить строки первой строчкой + добавить 3е значение (http://forum.oszone.net/showthread.php?t=350916)

spb-nord 21-03-2022 17:50 2982087

CMD/BAT - Дополнить строки первой строчкой + добавить 3е значение
 
Добрый день.
В фирме 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 2982092

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 2982096

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

megaloman 21-03-2022 20:17 2982103

Попробуйте. Здесь 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 2982120

Спасибо огромное! Все супер


Время: 23:48.

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