批处理文件标记忽略空分隔符

时间:2016-04-02 11:04:52

标签: windows batch-file command-line

我正在尝试将CS​​V文件中的列加载到变量中。我的CSV文件包含空列,因此,,可能会被以下内容忽略:

FOR /F "tokens=3 delims=," %%a in (csvfile.csv) do (
    set date=%%a
    echo %%a
)

因此,如果文件csvfile.csv包含

fred,wilma,tony, john, greg, wilber, blake
chris,,steve,deon,bryan,mark,anthony

我想结果:

tony
steve

但我明白了:

tony
deon

如果我在空列中放置一个空格,这确实可以正常工作。

如何设置delims以便它不会忽略空列?

2 个答案:

答案 0 :(得分:3)

for将连续分隔符视为一个。在大多数情况下,这很有帮助。有时它不是。

所以你必须以for可以按照你的意图处理的方式编写你的行。

整体阅读文件的每一行,在开头和结尾添加引号,并将每个,替换为",",从而产生

"chris","","steve","deon","bryan","mark","anthony"

这可以很高兴地用另一个for解析。 %%~b中的波浪号删除了周围的引号。

@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=*" %%a in (csvfile.csv) do (
  set line="%%a"
  for /f "tokens=3 delims=," %%b in ("!line:,="^,"!") do echo %%~b
)

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=U:\sourcedir"
SET "filename1=%sourcedir%\q36372429.txt"
SET "oneline="

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 SET "line=%%a"
 FOR /f "tokens=3delims=," %%h IN (" !line:,= , ! ") DO (
  SET "column=%%h"
  SET "oneline=!oneline! !column:~1,-1!"
  ECHO(!column:~1,-1!
 )
)
ECHO %oneline:~1%

GOTO :EOF

您需要更改sourcedirfilename1的设置以适合您的具体情况。

我使用了一个名为q36372429.txt的文件,其中包含我的测试数据。

不幸的是,您还没有向我们展示真实的数据样本。我非常怀疑你使用date作为目标变量。

date是一个“神奇变量” - 由系统维护为当前日期。它可以被覆盖,但不建议这样做。

你想要从这个程序中得到什么并不是很清楚。也许您希望第3列中的条目全部在线上,或者您可能只希望列出第3列,或者您希望将输出传输到新文件。