DOS批处理文件正在跳过FOR delims

时间:2011-09-23 07:35:19

标签: windows-7 batch-file delimited-text

我正在尝试解析一个文本文件,如果它是空的,它正在跳过一个列。 这是文件格式:

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 = XXX
- 指定分隔符集。这将替换默认的空格分隔符集和选项卡

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

我做错了什么?

<小时/> 的修改

jeb得到了它 - 谢谢!

将结果吐出到我的文件中,我只使用:

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

1 个答案:

答案 0 :(得分:2)

delim机制的工作方式是将一个或多个连续的delim减少为单个delim,这就是为什么你不能以这种方式得到一个空列。

但在你的情况下,用delim和none delim字符替换delims似乎很容易 喜欢: 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!
  )
)