使用命令查找~1000 CSV的行数

时间:2018-03-22 12:59:31

标签: windows batch-file

我正在运行一个进程,该进程在给定输入CSV的不同时间戳上产生n个输出。输出文件采用CSV格式,并标记为:

"输出" _ RouteName _ Direction _ YYMMDD _ HHMMSS

我有一个报告文件中缺少数据的宏,我只需要列出每个CSV中的行数。 我一直在使用命令执行此操作:

@Echo Off
:_Loop
If "%~1"=="" Pause&Goto EOF
Find /C /V "Wont@findthisin#anyfile" %1 >> LineCount.txt
Shift
Goto _Loop

该命令名为counter.cmd,我只需将输出CSV拖入其中,然后在每个输出的文本文件中创建此输出:

---------- R:\10_TECHNICAL\10_TESTRUN\RUN\AM\ITN\A6_1N\OUTPUT_A6_1N_180313_070112.CSV: 5

问题在于,我只能使用此命令处理最多约100个文件,并且我有~1000个输出文件。当我尝试使它完成所有1000个文件时,我收到此错误:

Error

我有相对基本的Windows命令脚本技能,所以不知道如何克服这个问题。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:4)

在我找到问题的根源和修复之前,我想指出一些可以改善当前脚本的事情。

1)您的FIND命令可以简化为find /n /v "" filePath - 它似乎没有意义,但它确实有效。

2)GOTO相对较慢。您可以通过使用FOR命令处理所有参数来摆脱GOTO循环。您可以使用%*来检索所有参数。

3)每次重定向文件时都必须打开,文件指针位于文件末尾。这需要时间。只重定向一次要快得多。

结合以上所有内容,您的脚本可以像

一样简单
@echo off
> LineCount.txt (for %%F in (%*) do find /n /v "" "%%F")
pause

将文件拖动到批处理脚本时,它会创建一个包含每个文件路径的命令行。 Windows命令行的长度限制为8191个字节。因此,如果你有大约1000个文件,你的策略就无法运作。

我假设您的所有文件都在一个文件夹中,在这种情况下,您可以更改脚本以处理单个文件夹路径而不是文件路径列表。

@echo off
>LineCount.txt (for %%F in ("%~1\*.csv") do find /n /v "" "%%F")
pause

如果文件分布在几个文件夹中,那么您可以添加一个额外的循环来迭代每个文件夹

@echo off
>LineCount.txt ( for %%A in (%*) do for %%F in ("%%~A\*.csv") do find /n /v "" %%F")
pause

答案 1 :(得分:2)

我必须假设限制是使用%1变量和允许的最大命令行长度。

使用单个命令行

可以很容易地解决这个问题
@Find /C /V "" R:\10_Technical\10_TestRun\Run\AM\ITN\A6_1N\*.csv > LineCount.txt

修改

您也可以将包含csv文件的文件夹拖放到批处理文件中。

如果你想将输出文件放在与csv相同的目录中,那么使用:

@Find /C /V "" "%~1\*.csv" > "%~1\LineCount.txt"

或与批处理文件位于同一目录中:

@Find /C /V "" "%~1\*.csv" > "%~dp0LineCount.txt"

您甚至可以将其输出到包含该文件夹的目录:

@Find /C /V "" "%~1\*.csv" > "LineCount.txt"