Windows批处理文件,如果任何列为空,则删除csv文件中的这些行

时间:2016-11-08 14:51:44

标签: windows csv batch-file

我有一个包含7列的csv文件:

Line 1 : a,b,c,,d,e,f
Line 2 : a,b,c,d,e,f,g
Line 3 : a,b,c,d,e,f,

我想在Windows中编写一个批处理文件,执行该文件时会创建一个新的csv 文件只包含非空行,即:

Line 2 : a,b,c,d,e,f,g

3 个答案:

答案 0 :(得分:2)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q40489960.txt"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 FOR /f "tokens=7delims=," %%x IN ("%%a") DO ECHO %%a
)
)>"%outfile%"

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况 我使用了一个名为q40489960.txt的文件,其中包含我的测试数据 生成定义为%outfile%

的文件

将文件的每一行读取到%%a,然后查看%%a是否有七个令牌。如果是,输出它,否则跳过它。

答案 1 :(得分:0)

这是一种使用find查找带有两个连续逗号的行的方法:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "INFILE=sample.csv"
set "OUTFILE=con"

> "%OUTFILE%" (
    for /F "usebackq delims=" %%L in ("%INFILE%") do (
        (echo(",%%L," | > nul find /V ",,") && echo(%%L
    )
)

endlocal
exit /B

为了实现这一目标,每行必须先加,,然后再加上,暂时;否则,将无法识别行的开头或结尾处的空字段。

由于CSV数据可能包含带引号的值,这些值包含不被视为分隔符的文字逗号,因此对于此类文件,该方法会变得更加复杂:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "INFILE=sample.csv" & rem // (input file; `%~1` is argument)
set "OUTFILE=con"       & rem // (output file; `con` is console)

> "%OUTFILE%" (
    for /F "usebackq delims=" %%L in ("%INFILE%") do (
        set "LINE=%%L" & set "FLAG=#"
        setlocal EnableDelayedExpansion
        rem Double " temporarily:
        set "LINE=!LINE:"=""!^"
        for %%I in ("!LINE:,=","!") do (
            endlocal
            if "%%~I"=="" set "FLAG="
            setlocal EnableDelayedExpansion
        )
        endlocal
        if defined FLAG echo(%%L
    )
)

endlocal
exit /B

答案 2 :(得分:0)

...没有for循环?

findstr/v "\<, ,, ,\>" old.csv>new.csv

这不需要设定数量的列,只需将完整的列输出到新文件