代码之家  ›  专栏  ›  技术社区  ›  hoang

如何检查csv文件中每行的列数?

  •  1
  • hoang  · 技术社区  · 14 年前

    我有一个大文件,有上万行,其中包含由 | 在我的数据库中进行批量插入。 我知道应该有10列。

    | ,可能会发生错误,因为列数与此行不匹配。

    @ECHO OFF
    set /a count=0
    FOR /f "tokens=10,* delims=|" %%i in (%1) DO (
      if not "%%j"=="" (
        set /a count+=1
      )
    )
    echo %count%
    :eof
    

    它工作得很好。。。但只有在没有任何字段是空的情况下,才会转移计数,因为 delims 处理空格等分隔符

    e.g  
        1|2|3|4|5|6|7|8|9|10 => cool, 10 columns
        1|2|3|4|5|6|7|8|almost got|you|10 => found 11 columns 
        1|2|3|4||6|7|8|got|you|10 => damn, reports as 10 columns
    

    如何仅使用命令行/Windows批处理解决此问题?

    N、 乙。

    1 回复  |  直到 14 年前
        1
  •  1
  •   indiv Olivier Poulin    14 年前

    你可以用 findstr 给它一个正则表达式。假设您知道您的行至少有10列,这意味着它至少有9个管道字符。您需要找到哪些行有10个或更多管道字符。我们可以想出这个规则:

    .*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*  Line has at least 10 pipe characters, meaning
                                      some data field contains a pipe character.
    

    把正则表达式给 芬德斯特 .

    findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt
    

    find /c 数数它吐出的行数。

    findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt | find /c "|"
    

    例子 data.txt

    1|2|3|4|5|6|7|8|9|10                 good - 10 columns
    1|2|3|4|5|6|7|8|almost got|you|10    bad  - 11 columns
    1|2|3|4||6|7|8|got|you|10            bad  - 11 columns
    1|2|3|4|5|6|7|8|9||                  bad  - 11 columns
    1|2|3|4|5|6|7|8|9                    good - 10 columns
    1|2|3|4|5|6|7                        gotcha - less than 10 columns not detected
    1|2|3|4|5|6|7|8|9|                   good - 10 columns
    |||||||||                            good - 10 columns
    ||||||||||                           bad  - 11 columns
    
    C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt
    1|2|3|4|5|6|7|8|almost got|you|10    bad  - 11 columns
    1|2|3|4||6|7|8|got|you|10            bad  - 11 columns
    1|2|3|4|5|6|7|8|9||                  bad  - 11 columns
    ||||||||||                           bad  - 11 columns
    
    C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt | find /c "|"
    4