我有很多带有数据的.csv
个文件,但有些行的列数可能比我需要的少。我想跳过这些行,继续只读取具有正确列数的行(我知道列的正确数量是多少)。
不幸的是我必须用批处理文件来做...任何想法?
答案 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
[^,]*,[^,]*,[^,]*,[^,]*,[^,]* [^,]*,[^,]*,"[^"]*",[^,]*,[^,]*
然后搜索
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数据包含自己包含逗号的引用字段的情况,此任务在纯batch-file脚本中实现并不是很容易,但可能的话,只要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