如何跳过列数太少的行

时间:2016-11-30 08:55:40

标签: windows batch-file command-line cmd

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

不幸的是我必须用批处理文件来做...任何想法?

2 个答案:

答案 0 :(得分: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行:处理第3个字段中引用字符串的大小写

然后搜索

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
)

答案 1 :(得分:0)

考虑到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