【问题标题】:How to skip rows with too few column numbers如何跳过列号太少的行
【发布时间】:2016-11-30 08:55:40
【问题描述】:

我有许多包含数据的 .csv 文件,但有些行的列数可能比我需要的少。我想跳过这些行,并继续只读取这些具有正确列数的行(我知道正确的列数是多少)。

不幸的是我必须用批处理文件来做......有什么想法吗?

【问题讨论】:

  • 你的老板是虐待狂吗?为什么要坚持使用如此糟糕的技术来完成一项相当复杂的任务?
  • 视情况而定。任何一列都会是空的吗?可以引用包含逗号的任何列吗?为什么要对“正确的列数”保密?您可以在帖子中编辑几行包含通过/失败条件的示例数据吗?

标签: windows batch-file command-line cmd


【解决方案1】:

您可以使用findstr

example.txt

qwe,ert,"adsad,asdas",1,2
kks,ssd,qweq,3,4
asdas,asdd
as,sdsd,weqw,5,6

创建一个带有搜索模式的文件:

patterns.txt

[^,]*,[^,]*,[^,]*,[^,]*,[^,]*
[^,]*,[^,]*,"[^"]*",[^,]*,[^,]*
  • 第 1 行:五个值用逗号分隔
  • 第 2 行:处理第三个字段中带引号的字符串的大小写

然后搜索

C:\> findstr /rx /g:patterns.txt example.txt
qwe,ert,"adsad,asdas",1,2
kks,ssd,qweq,3,4
as,sdsd,weqw,5,6

解析输出

for /f "tokens=*" %%A in ('findstr /rx /g:patterns.txt example.txt') do (
    echo %%A
)

【讨论】:

    【解决方案2】:

    考虑到 CSV 数据包含自己包含逗号的引用字段的情况,此任务在纯 脚本中实现并非易事,但如果 CSV 文件满足以下要求,则可能:

    • CSV 文件中没有出现* 字符;
    • 没有(带引号的)字段包含换行符;

    以下脚本计算每行/行的字段/列数,并仅在满足预定义值 (5) 的情况下处理(回显)它;提供 CSV 文件作为命令行参数:

    @echo off
    setlocal EnableExtensions DisableDelayedExpansion
    
    rem // Define constants here:
    set "_NUMCOL=5"
    
    for %%F in (%*) do (
        for /F usebackq^ delims^=^ eol^= %%L in ("%%~F") do (
            set "LINE=%%L"
            set /A "COUNT=0"
            setlocal EnableDelayedExpansion
            if "!LINE:**=!"=="!LINE!" (
                set "LINE=!LINE:?=!"
                for %%E in ("!LINE:,=","!") do (
                    set /A "COUNT+=1"
                )
                if !COUNT! LSS !_NUMCOL! (
                    endlocal
                ) else if !COUNT! GTR !_NUMCOL! (
                    endlocal
                ) else (
                    endlocal
                    rem // Process line with correct number of columns:
                    echo(%%L
                )
            ) else (
                endlocal
            )
        )
    )
    
    endlocal
    exit /B
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多