如何在Windows批处理文件中读取逗号分隔的文本文件?

时间:2015-02-09 18:18:39

标签: batch-file

我的下一个文件txt只有一行:

1,2,3,4,5,6,...,n

我需要捕获所有以逗号分隔的数字。

3 个答案:

答案 0 :(得分:3)

@echo off
setlocal

set /P "numbers="<csvfile

for %%I in (%numbers%) do (
    echo %%I
)

不带开关的for命令使用逗号,分号,空格和制表符作为分隔符。在上面的示例中,%%I将从左到右依次为每个数字。

答案 1 :(得分:3)

@echo off
    setlocal enableextensions enabledelayedexpansion

    rem Variable to hold digits while reading numbers
    set "number="
    rem Variable to hold the table index where data is captured
    set "n=0"

    rem Decompose input file in characters and filter
    for /f %%a in ('
        cmd /q /u /c "type numbers.txt&echo(," ^| more ^| findstr /r /x /c:"[0-9,]"
    ') do if "%%a"=="," (
        rem If a comma is found, capture current number
        if defined number set /a "numbers[!n!]=!number!", "n+=1"
        set "number="
    ) else (
        rem If it is not a comma, is a number to concatenate to current one
        set "number=!number!%%a"
    )

    rem Show numbers captured
    set numbers[

这将&#34;捕获&#34;将每个值放入数组的元素中。由于必须通过for命令将完整数据加载到内存中,并且输入文件中的每个有效字符都包含CRLF结尾,因此输入行中的限制大约为715 MB。

答案 2 :(得分:3)

rojo为相对较小的数据集提供了一个很好的解决方案。

MC ND为大型数据集显示了一个很好的纯批处理解决方案,除非它变得非常慢。

大型数据集的快速解决方案需要使用纯批次以外的其他方法。一个选项是我的JREPL.BAT utility,一个混合的JScript /批处理脚本,可以对文本执行正则表达式替换。

假设JREPL.BAT位于PATH的某个位置,并且您的csv是&#34; test.csv&#34;,则以下内容将打印出每个数字,每行一个:

jrepl "," "\n" /x /f "test.csv"

由于JREPL是一个批处理脚本,如果要在另一个批处理脚本中使用它,则必须使用CALL JREPL

以下说明如何将数字存储在&#34;数组中。变量,使用FINDSTR建立数组索引。请注意,我不需要call jrepl,因为jrepl在FOR IN(&#39;&#39;)子句中使用:

@echo off
setlocal enableDelayedExpansion

:: Store the numbers in an array
for /f "tokens=1,2 delims=:" %%A in (
  'jrepl "," "\n" /x /f "test.csv" ^| findstr /n "^"'
) do (
  set "n[%%A]=%%B"
  set "n.count=%%A"
)

:: Display the numbers
for /l %%N in (1 1 %n.count%) do echo !n[%%N]!

或者您可以使用JREPL解析数字并建立索引值。这需要更多代码,但效率更高:

@echo off
setlocal enableDelayedExpansion

:: Store the numbers in an array
for /f "tokens=1,2 delims=:" %%A in (
  'jrepl "\d+" "(n+=1)+':'+$0" /jmatch /jbeg "var n=0" /f "test.csv"'
) do (
  set "n[%%A]=%%B"
  set "n.count=%%A"
)

:: Display the numbers
for /l %%N in (1 1 %n.count%) do echo !n[%%N]!