用于计算每个文件行数的批处理文件并保存在txt

时间:2017-12-12 20:14:58

标签: csv batch-file cmd

我一直在尝试创建一个批处理文件,该文件将计算多个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?  然后从那里我刚刚在网上寻找想法

5 个答案:

答案 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 >outputfilec只计算。 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字符,那将非常有用。