我一直在尝试创建一个批处理文件,该文件将计算多个csv文件中的行数并将其输出到txt文件中。我已经设法弄清楚如何让批处理文件计算行并放入一个文本文件,但我找不到一种方法来获取它来提供文件的名称和文件中有多少行像这样..
file1.csv 100
file2.csv 112
我所要做的就是从一个文件中获取行,或者从所有csv文件中添加行,并为我提供一个组合数字。
这是我试图以我的批次为基础的代码..
@echo off
cls
setlocal EnableDelayedExpansion
set "cmd=findstr /R /N "^^" file.txt | find /C ":""
for /f %%a in ('!cmd!') do set number=%%a
echo %number% >>list.txt
我从这里发现它不是我的代码 How to count no of lines in text file and store the value into a variable using batch script? 然后从那里我刚刚在网上寻找想法
答案 0 :(得分:1)
在最简单的形式中,您可以使用find命令获取每个文件中行数的计数。
find /C /V "" file*.csv>count.log
这将输出这样的东西。
---------- FILE1.CSV: 19
---------- FILE2.CSV: 28
---------- FILE3.CSV: 3
如果您想删除空行和前导连字符,可以通过FOR /F
命令运行它。
@echo off
FOR /F "tokens=* delims=- " %%G IN ('find /C /V "" file*.csv') DO ECHO %%G>>count.log
这将为您提供这样的输出。
FILE1.CSV: 19
FILE2.CSV: 28
FILE3.CSV: 3
修改强>
这是我的修改版本,因为你显然不喜欢输出中的冒号。
set total=0
(
FOR /F "tokens=1* delims=:" %%G IN ('find /C /V "" *.csv') DO (
FOR /F "Tokens=1* delims= " %%I IN ("%%~G") DO ECHO %%J %%H&set /a total+=%%H
)
CALL ECHO Total %%total%%
)>List.txt
以下是使用Magoo管道逻辑的一些定时结果,Magoo使用重定向逻辑,并且我直接使用查找结果。这是使用437MB文件和8,895,540行测试的。
Magoo Pipe: 0 Days 0 Hours 0 Minutes And 15.19 Seconds
Magoo Redirection: 0 Days 0 Hours 0 Minutes And 5.471 Seconds
Squashman File: 0 Days 0 Hours 0 Minutes And 5.429 Seconds
答案 1 :(得分:1)
@echo off
cls
setlocal EnableDelayedExpansion
set /a total=0
(
for %%f in (*.csv) do (
for /f %%a in ('type "%%f"^|find /C /v "" ') do set /a total+=%%a&echo %%f %%a
)
echo total !total!
)>>list.txt
GOTO :EOF
将每个.csv
文件名依次分配给%%f
。
type
将该文件存入find
并计算行数。根据找到的计数增加总数,并显示文件名和单个行数(%%a
)
完成后,显示总数。
将所有输出重定向到list.txt
。
答案 2 :(得分:0)
对于包含大量行的文件,这会快很多倍。
使用cscript //nologo "C:\folder\script.vbs" c <inputfile >outputfile
。 c
只计算。 l
计算并显示线条。它几乎不使用任何内存。它设置环境变量Filter_LineCount
If LCase(Arg(0)) = "l" then
Do Until Inp.AtEndOfStream
Line=Inp.readline
Count = Count +1
outp.writeline Line
Loop
ElseIf LCase(Arg(0)) = "c" then
Do Until Inp.AtEndOfStream
Line=Inp.readline
Count = Count +1
Loop
outp.writeline Count
End If
'Create a batchfile that filter.bat will run as last step to set the environmental variable %Filter_LineCount%.
On Error Resume Next
Set Fso = CreateObject("Scripting.FileSystemObject")
Set File = Fso.CreateTextFile("%temp%\FilterExit.bat", True)
If err.number <> 0 then
Outp.WriteLine "Error: " & err.number & " " & err.description & " from " & err.source
err.clear
wscript.exit
End If
File.WriteLine "set Filter_LineCount=" & Count
File.close
在调用它的批处理文件中,将这些行放在最后
If exist "%Temp%\FilterExit.bat" call "%Temp%\FilterExit.bat"
If exist "%temp%\FilterExit.bat" del "%Temp%\FilterExit.bat"
<强> LineCount 强>
过滤器lc {c | l} 过滤行数{c | l}
计算文件中的行数。将计数或行打印到StdOut,并将环境变量Filter_LineCount设置为计数。
l - prints the lines and sets the environmental variable Filter_LineCount to the count.
c - prints the count and sets the environmental variable Filter_LineCount to the count.
示例强>
filter lc c < "%systemroot%\win.ini"
答案 3 :(得分:0)
我喜欢Squashman&#39; approach,但在文件名以连字符-
开头的极少数情况下会失败。此外,find
将所有文件名转换为大写。
如果您想要原始文件名并且文件名以-
开头,则可以使用:
@echo off
> "count.log" (
for %%F in ("file*.csv") do (
for /F %%E in ('^< "%%~F" find /C /V ""') do (
echo(%%~F: %%E
)
)
)
这会对input redirection <
使用find
command,因此它会返回没有任何前缀的纯行数。
答案 4 :(得分:0)
PowerShell的方式是:
Get-ChildItem -File *.csv |
ForEach-Object {[string]::Format('{0} {1}', $_.name, (Get-Content $_.FullName).Length)} |
Out-File -FilePath countls2.txt -Encoding ASCII
使用不应放入.ps1文件的别名:
gci *.csv|%{[string]::Format('{0}: {1}',$_.name,(gc $_.FullName).Length)}|Out-File countls2.txt ASCII
我预测你会想要引用文件名或在计数之前使用分隔符。如果文件名中包含SPACE字符,那将非常有用。