Не удается получить полный второй параметр в цикле for / f - PullRequest
0 голосов
/ 12 июня 2018

У меня есть файл, подобный следующему:

001;0009;024;165748;0634;;CAPO;
001;0009;030;143366;0633;;CAPO;
001;0009;030;160671;0644;31/05/2018;PART;
001;0009;030;160857;0644;;PART;
001;0009;031;168135;0644;;PART;
001;0009;046;168085;0612;;CAPO;
002;0002;007;286169;4013;21/03/2018;PART;
002;0002;009;053175;4013;;PART;
002;0002;026;241075;4023;01/02/2018;PART;
002;0002;026;241076;4023;01/02/2018;PART;
002;0002;026;241102;4023;;PART;

Мне нужно создать несколько файлов, которые будут разбиты при изменении первых 3 символов, каждый из которых будет именоваться 3 первыми символами.Итак, следуя примеру, у меня будет

001.txt с

001;0009;024;165748;0634;;CAPO;
001;0009;030;143366;0633;;CAPO;
001;0009;030;160671;0644;31/05/2018;PART;
001;0009;030;160857;0644;;PART;
001;0009;031;168135;0644;;PART;
001;0009;046;168085;0612;;CAPO;

002.txt с

002;0002;007;286169;4013;21/03/2018;PART;
002;0002;009;053175;4013;;PART;
002;0002;026;241075;4023;01/02/2018;PART;
002;0002;026;241076;4023;01/02/2018;PART;
002;0002;026;241102;4023;;PART;

Я частично достиг этого с помощью этого пакета:

@@echo off
setlocal ENABLEDELAYEDEXPANSION
@echo Wait please...
set header=field1;field2;field3;field4;field5;field6;field7;field8
set craold=""
set cranow=""
FOR /F "eol=; tokens=1,* delims=;" %%a in (myfilename.csv) do call :doTheWork %%a %%b
@echo Ended
pause
GOTO :EOF

:doTheWork
set cranow=%1
IF NOT !craold!==!cranow! (
   call :createFile %cranow%
   set craold=!cranow!
)
set recfilename=%craold%.txt
@echo %1;%2 >> %recfilename%
GOTO :END

:createFile
set myfilename=%1.txt
@echo %header% > %myfilename%
@echo CRA: %1
GOTO :END

:END

Моя проблема в том, что в моих файлах я нахожу только это:

001.txt с

field1;field2;field3;field4;field5;field6;field7;field8
001;0009
001;0009
001;0009
001;0009
001;0009
001;0009

002.txt с

field1;field2;field3;field4;field5;field6;field7;field8
002;0002
002;0002
002;0002
002;0002
002;0002

Кажется, что "eol =; tokens = 1, * delims =;"не работает правильно, забывая, что второй параметр прагмы "tokens" должен занимать оставшуюся часть строки ввода.Зачем?Предложения?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Исходя из моего начального комментария и вашего нового теста, как прокомментировано :

FOR /F "tokens=1,* delims=;" %%a in (rapporti.csv) do (
    set param1=%%a
    set param2=%%b
    @echo In loop !param1! !param2!
    call :doTheWork !param1! !param2!
)

Нет необходимости устанавливать какие-либо переменные, и, следовательно, предварительно установленная задержкарасширение , потому что вы не изменяете возвращенные метавариабельные переменные.

Вы должны заключить в кавычки переданные аргументы в команде Call, чтобы защитить специальные символы, такие как ...
точки с запятой, ;!

For /F "Tokens=1* Delims=;" %%A In (rapporti.csv) Do (
    Echo In loop %%A;%%B
    Call :doTheWork %%A "%%B"
)

В :doTheWork вы можете удалить окружающие двойные кавычки из %2 по мере необходимости, обозначив его как %~2.

I 'Я рекомендую использовать двойные кавычки независимо от содержимого, однако я оставил это как необходимое на основе известной информации.

0 голосов
/ 13 июня 2018

Проблема не в for /F и его строке опции tokens=, а в аргументах call без кавычек, поэтому %2 разделяется в первый ;, что является ничем иным, как обычным токеномразделитель в cmd (точно так же, как SPACE , TAB , , и =).

Чтобы исправить это, заключите аргументы call вЗащитите разделители токенов и другие специальные символы:

call "%%a" "%%b"

И прочитайте аргументы, подобные этим, чтобы убрать кавычки:

echo %~1;%~2

Наконец, позвольте мне порекомендовать вам изменить синтаксис setна это:

set "header=field1;field2;field3;field4;field5;field6;field7;field8"

Кавычки здесь не становятся частью значения переменной, но специальные символы становятся защищенными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...