Batch file 批处理文件读写逗号删除的文本文件

Batch file 批处理文件读写逗号删除的文本文件,batch-file,comma,Batch File,Comma,我需要帮助读取/写入逗号删除的文本文件,同时排除其中没有足够数据的行。下面是一个示例文本文件。最后两行应该从NewFile.csv中排除 DepositDate,Batch,Trans,CkSeq,AcctNum,CkAmnt,R/T,CkNum,,Amnt,crxtal,cdv,OCRScanLine,DRNum 05/19/2014,3621,1,1,22800,50.00,1123444,047886,100,50.00,8,9,000473865000000050009,165289 0

我需要帮助读取/写入逗号删除的文本文件,同时排除其中没有足够数据的行。下面是一个示例文本文件。最后两行应该从NewFile.csv中排除

DepositDate,Batch,Trans,CkSeq,AcctNum,CkAmnt,R/T,CkNum,,Amnt,crxtal,cdv,OCRScanLine,DRNum
05/19/2014,3621,1,1,22800,50.00,1123444,047886,100,50.00,8,9,000473865000000050009,165289
05/19/2014,3622,1,1,7704094,50.00,684335879,006450,,,,,,
05/19/2014,11075,1,,,,,,,,,,,
05/19/2014,11075,2,,,,,,,,,,,
这是我的密码:

::clear variables
Set _var1=
Set _var2=
Set _var3=
Set _var4=
Set _var5=
Set _var6=
Set _var7=
Set _var8=
Set _var9=
Set _var10=
Set _var11=
Set _var12=
Set _var13=
Set _var13=
Set _var14=
Set _var99=

::start loop through file skipping header row, identifying 14 fields and a comma delimeter
FOR /F "skip=1 tokens=1-14* delims=," %%A IN (with.csv) DO (

::set variables for the row values
Set _var1=%%A
Set _var2=%%B
Set _var3=%%C
Set _var4=%%D
Set _var5=%%E
Set _var6=%%F
Set _var7=%%G
Set _var8=%%H
Set _var9=%%I
Set _var10=%%J
Set _var11=%%K
Set _var12=%%L
Set _var13=%%M
Set _var14=%%N
::echo a variable to verify it is populated with data...DOESN'T WORK!
echo._var1 %_var1%

::concatenate the 12 rightmost tokens into a string to verify if they are all blank
Set _var99=%_var3%%_var4%%_var5%%_var6%%_var7%%_var8%%_var9%%_var10%%_var11%%_var12%%_var13%%_var14%
pause

CALL :PROCESS
)

GOTO :EOF

:PROCESS
echo._var99 %_var99%
pause

::test if _var99 is all blank then don't write that row to the new file.
if NOT %_var99%=="" echo %_var1%,%_var2%,%_var3%,%_var4%,%_var5%,%_var6%,%_var7%,%_var8%,%_var9%,%_var10%,%_var11%,%_var12%,%_var13%,%_var14% >>NewFile.csv
GOTO :EOF

如果要在同一循环中设置的循环中展开变量,则需要使用延迟展开。这需要
setlocalenabledelayedexpansion
!瓦尔而不是
%var%

但是您仍然可能会遇到问题,因为您没有验证前3列是否已填充。使用FOR/F不是一件容易的任务

有一个简单的单线解决方案使用FINDSTR和更多。MORE用于跳过第一行,FINDSTR只保留填充了前3列的行,以及之后至少一个填充的列

findstr "^[^,][^,]*,[^,][^,]*,[^,][^,]*,*[^,]" with.csv|more +1 >newFile.csv
如果由于以上限制,输出超过64K行,则上述操作将失败(挂起)。如果这是一个问题,那么您可以使用一个额外的FINDSTR,假设您的数据行都不包含标题文本

findstr "^[^,][^,]*,[^,][^,]*,[^,][^,]*,*[^,]" with.csv|findstr /vb DepositDate >newFile.csv
请注意,此方法不能无限期扩展,因为FINDSTR在搜索字符串中最多只能包含15个字符的类表达式

@echo off
    setlocal enableextensions disabledelayedexpansion

    (   for /f "skip=1 delims=" %%a in (with.csv
        ) do for /f "tokens=4 delims=," %%b in ("%%a"
        ) do echo(%%a
    ) > newFile.csv

    endlocal
这是对文件内容的“放松”检查。它所做的是迭代输入文件(跳过第一行),并为其中的每一行标记该行,并尝试获取第四个逗号分隔的标记。如果该行不包含至少4列数据,则不可能填充第四个标记,并且不会执行内部
for
循环(输出原始行)中的代码


但正如所指出的,这是一个“宽松”的检查。它不会测试哪四列包含数据。

那么您看到了什么问题?仅供参考,在最后一行之前,您需要将
放在变量周围,就像
如果不是“!\u var99!”==”
。您还需要使用延迟扩展并为
替换
%
用于循环中需要扩展的所有内容。例如,
echo_var1_var2等。