我有一个包含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
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况
我使用了一个名为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
这不需要设定数量的列,只需将完整的列输出到新文件。