Пакетный DOS пропускает для разделителей - PullRequest
3 голосов
/ 23 сентября 2011

Я пытаюсь разобрать текстовый файл, и он работает отдельно от пропуска столбца, если он пуст. Вот формат файла:

206695844   66583369    L   CAT 1   1   4144042 214857      64378180    L   4144039 214853  Y
206669467   127810625   R   CAT 38  1   4136724 213413      724749204   R   4136727 213420  Y
206445106   65588013    L   CAT 4   1   4139084 210381      64363708    L   4139082 210372  Y

                                                         ^
                                                    empty column

Как видите, существует 14 столбцов, каждый из которых разделен символом табуляции.

Моя строка анализа:

FOR /F "tokens=1,2,5,7,8,9" %%i in (datafile.txt) DO (
   echo %%i %%j %%k %%l %%m %%n >> outputDatafile.txt
)

Проблема в том, что он пропускает 9-й столбец (в примере не указан) и вместо него использует 10-й, как в:

206695844   66583369    1   4144042 214857  64378180

Я хочу этот 9-й столбец - даже если он пуст!

Я также пытался использовать явный символ табуляции в качестве разделителя, потому что справка для FOR говорит:

delims = ххх
- определяет набор разделителей. Это заменяет набор пробелов по умолчанию и вкладку
:

FOR /F "tokens=1,2,5,7,8,9* delims= " %%i in (datafile.txt) DO (
                                   ^tab

Что я делаю не так?


EDIT

Джеб понял - спасибо!

, чтобы выложить результат в мой файл, я просто использую:

echo (!col1!%tab%!col2!%tab%!col3!%tab%!col4!%tab%!col5!%tab%!col6!) >> outputFile.txt

1 Ответ

2 голосов
/ 23 сентября 2011

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

Но в вашем случае кажется, что легко заменить разделители на разделители и символы без разделителей.
Подобно: set "line=#!line:<TAB>=<TAB>#!"

Тогда перед каждым столбцом стоит префикс #, так что вы можете получить даже «пустые» столбцы.
Вам нужно только удалить всегда первый символ.

setlocal EnableDelayedExpansion
set "tab=   "
FOR /F "delims=" %%L in (datafile.txt) DO (
  set "line=%%L"
  set "line=#!line:%TAB%=%TAB%#!"
  for /F "tokens=1,2,5,7,8,9 delims=%TAB%" %%1 in ("!line!") DO (
    echo %%1, %%2, %%3,  %%4, %%5, %%6
    set "col1=%%1"
    set "col1=!col1:~1!"
    echo(!col1!
  )
)
...