我需要帮助读取/写入逗号分隔的文本文件,同时排除其中没有足够数据的行。以下是示例文本文件。最后两行应该从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
答案 0 :(得分:1)
如果要在同一循环中设置的循环内扩展变量,则需要使用延迟扩展。这需要setlocal enableDelayedExpansion
和!var!
而不是%var%
。
但是你仍然可以遇到问题,因为你没有验证是否填充了前3列。使用FOR / F不是一件容易的事。
使用FINDSTR和MORE有一个简单的单行解决方案。 MORE用于跳过第一行,FINDSTR仅保留已填充前3列的行,此后至少还有一个填充的列。
findstr "^[^,][^,]*,[^,][^,]*,[^,][^,]*,*[^,]" with.csv|more +1 >newFile.csv
如果由于MORE的限制输出超过64K行,则上述将失败(挂起)。如果这是一个问题,那么您可以使用额外的FINDSTR,假设您的数据行都不包含标题文本。
findstr "^[^,][^,]*,[^,][^,]*,[^,][^,]*,*[^,]" with.csv|findstr /vb DepositDate >newFile.csv
请注意,此方法无法无限期扩展,因为FINDSTR仅限于搜索字符串中最多15个字符的类表达式。
答案 1 :(得分:0)
@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
循环中的代码(输出原始行)。
但如上所述,这是一项“轻松”的检查。它不测试哪四列包含数据。