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

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

adrobkov@vk 29-08-2013 12:49 2209578

Добавление строк по шаблону...
 
Доброго дня! Я понимаю, что задача, которая возникла передо мной с моими знаниями не выполнима.. Поэтому надеюсь хоть на какую-то помощь)))... Если такое возможно средствами командной строки... Опишу ситуацию и цель..
Есть csv-файл образец-шаблон:
читать дальше »

20100;d2-01:
20300;d2-02
30100;d3-01
30110;d3-02
30120;d3-03
30130;d3-04
30140;d3-05
30200;d3-06
30210;d3-07
30220;d3-08
30230;d3-09
30240;d3-10
30300;d3-11
30310;d3-12
30320;d3-13
30330;d3-14
30340;d3-15
40100;d4-01
40110;d4-02
40120;d4-03
40130;d4-04
40140;d4-05
40200;d4-06
40300;d4-07
40400;d4-08
40600;d4-09
40610;d4-10
40620;d4-11
40630;d4-12
40700;d4-13
40710;d4-14
40720;d4-15
40730;d4-16
40800;d4-17
40810;d4-18
40820;d4-19
40830;d4-20
50000;d5-01
50100;d5-02
50200;d5-03
50300;d5-04
50400;d5-05

Это эталон будущей примерной структуры необходимого файла...
Есть файл work.csv с примерной структурой:
читать дальше »

20100;xxx
20300;zzz
30200;aaa
30210;bbb
20100;qqq
20300;www
30200;rrr
20100;ttt
20300;yyy
20100;uuu
20300;iii
50300;ммм

Это как образец.... То есть структура не стабильная, первые ДВЕ строки, начинаюшиеся с 20100 и 20300 стабильны и считаются началом нового блока информации..., вполь до следующих "20100 и 20300"...
Остальные строки или есть или нет, или все или не все.. без всяких правил....
Цель преобразовать файл, добавив нехватающие строки по шаблону, со значением равным нулю, приведя к такому виду:
читать дальше »

20100;xxx
20300;zzz
30100;0
30110;0
30120;0
30130;0
30140;0
30200;aaa
30210;bbb
30220;0
30230;0
30240;0
30300;0
30310;0
30320;0
30330;0
30340;0
40100;0
40110;0
40120;0
40130;0
40140;0
40200;0
40300;0
40400;0
40600;0
40610;0
40620;0
40630;0
40700;0
40710;0
40720;0
40730;0
40800;0
40810;0
40820;0
40830;0
50000;0
50100;0
50200;0
50300;0
50400;0
20100;qqq
20300;www
30100;0
30110;0
30120;0
30130;0
30140;0
30200;0
30210;0
30200;rrr
30230;0
30240;0
30300;0
30310;0
30320;0
30330;0
30340;0
40100;0
40110;0
40120;0
40130;0
40140;0
40200;0
40300;0
40400;0
40600;0
40610;0
40620;0
40630;0
40700;0
40710;0
40720;0
40730;0
40800;0
40810;0
40820;0
40830;0
50000;0
50100;0
50200;0
50300;0
50400;0
20100;ttt
20300;yyy
30100;0
30110;0
30120;0
30130;0
30140;0
30200;0
30210;0
30200;0
30230;0
30240;0
30300;0
30310;0
30320;0
30330;0
30340;0
40100;0
40110;0
40120;0
40130;0
40140;0
40200;0
40300;0
40400;0
40600;0
40610;0
40620;0
40630;0
40700;0
40710;0
40720;0
40730;0
40800;0
40810;0
40820;0
40830;0
50000;0
50100;0
50200;0
50300;0
50400;0
20100;uuu
20300;iii
30100;0
30110;0
30120;0
30130;0
30140;0
30200;0
30210;0
30200;0
30230;0
30240;0
30300;0
30310;0
30320;0
30330;0
30340;0
40100;0
40110;0
40120;0
40130;0
40140;0
40200;0
40300;0
40400;0
40600;0
40610;0
40620;0
40630;0
40700;0
40710;0
40720;0
40730;0
40800;0
40810;0
40820;0
40830;0
50000;0
50100;0
50200;0
50300;ммм
50400;0

Помогите или подскажите как такое реализовать.... Средствами поиска и замены, это нереально много условий... Может кто-то знает, как это сделать проще?!

Iska 31-08-2013 04:32 2210501

Цитата:

Цитата adrobkov@vk
первые ДВЕ строки, начинаюшиеся с 20100 и 20300 стабильны и считаются началом нового блока информации..., вполь до следующих "20100 и 20300"... »

То есть, может если просто «20100» — то это не начало очередного блока?

adrobkov@vk 02-09-2013 10:19 2211377

Цитата:

То есть, может если просто «20100» — то это не начало очередного блока?
Начало... Строка начинающаяся с 20100 считается новым блоком... Все что находится после нее вплоть до следующих 20100 не включительно...

Anonymоus 03-09-2013 00:20 2211782

Код:

@Echo Off
SetLocal EnableDelayedExpansion

Set Input=work.csv
Set SphericalStandardFileInVacuum=standard.csv

:: Подготавливаем входящий файл
Copy "%Input%" "%Input%.bak">nul
Echo.>"%Input%"
:: Читаем файл-эталон и пишем строки из него в массив
Set StdData[]=
For /F "usebackq eol= tokens=1 delims=;" %%A In ("%SphericalStandardFileInVacuum%") Do (Set StdData[]=!StdData[]! %%A )
:: Разбираем входящий файл поблочно
For /F "usebackq eol= delims=" %%A In ("%Input%.bak") Do (
        Set Data=%%A
::        Работа с содержимым
        If "!Block!"=="true" If "!Data:~,6!"=="20100;" (
                Set Block=false
::                Обрабатываем данные
                Call :ParseBlock
::                Удаление
                Call :DeleteBlock
        )
::        Определение начала блока
        If "!Data:~,6!"=="20100;" (
                Set Block=true
                Set i=0
        )
::        Запись содержимого блока
        If "!Block!"=="true" (
                Set /A i+=1
                Set BlockData_!i!=!Data!
        )
)
:: Обработка завершающего блока
If Defined BlockData_1 (
        Call :ParseBlock
        Call :DeleteBlock
)
Del "%Input%.bak"
Pause&Exit

:ParseBlock
:: Пишем в массив строки, входящие в блок, одновременно с тем сохраняя их значения для последующего использования
Set BlockData[]=
For /F "eol= tokens=2,* delims=;=" %%A In ('Set BlockData_') Do (
        Set BlockData[]=!BlockData[]! %%A
        Set Data_%%A=%%B
)
:: Проходимся по массиву файла-эталона, определяя, какие строки в него включены
For %%A In (!StdData[]!) Do (
        Echo "!BlockData[]!"|Find " %%A ">nul&&(
                >>"%Input%" Echo %%A;!Data_%%A!
        )||(
                >>"%Input%" Echo %%A;0
        )
)
Exit /B

:DeleteBlock
:: Удаляем все записи блока
For /F "tokens=1 delims==" %%B In ('Set BlockData_') Do (Set %%B=)
Exit /B


Iska 03-09-2013 04:36 2211812

Anonymоus, это героически ;).


Время: 12:59.

Время: 12:59.
© OSzone.net 2001-