计算 CSV 文件中的行数并将结果导出到 CSV

Count Rows in CSV files and export results to CSV

我正在尝试计算文件夹中一堆 CSV 中包含值的行数。我设法获得了计算它的代码,但我似乎找不到将结果导出到 CSV 的方法。我得到的只是一个空白的 CSV。

我在这里错过了什么?

$FOLDER_ROOT = "C:\Test19"
$OUTPUT_CSV = "C:\Test19\Count.csv"

Get-ChildItem $FOLDER_ROOT -re -in "*.csv" | ForEach-Object {
    $filestats = Get-Content $_.Fullname | Measure-Object -Line
    $linesInFile = $filestats.Lines - 1
    Write-Host "$_,$linesInFile"
} | Export-Csv -Path $OUTPUT_CSV -NoType

Write-Host 只写入主机!您很可能在 PowerShell 控制台中看到了输出? 使用 Write-Output,它可以通过管道传输到 Export-CSV。

您的代码存在几个问题:

  • 使用 Get-ChildItem -Filter '*.csv' 而不是 Get-ChildItem -Include '*.csv'。前者比后者快

  • Write-Host 很可能导致输出直接进入主机控制台。我被告知这在最近的版本中已更改(以便主机输出进入新的信息流),但对于至少在 v5 之前的版本它仍然是现实。

  • Export-Csv 需要 object 输入,因为它将 object 的属性输出为 CSV 的字段(从 属性 第一个名字 object)。向其输入字符串 ("$_,$linesInFile") 将生成仅包含一列 "Length" 的 CSV,因为那是字符串 object 中唯一的 属性。

使用 calculated property 创建包含输入文件的文件名和行数的 CSV:

Get-ChildItem $FOLDER_ROOT -Recurse -Filter '*.csv' |
    Select-Object Name, @{n='LineCount';e={(Get-Content $_.Fullname | Measure-Object -Line).Lines - 1}} |
    Export-Csv $OUTPUT_CSV -NoType