统计文件夹中CSV文件数据行数并导出结果至CSV时遇空白文件问题
为啥你的导出CSV是空白的?
嘿,我一眼就瞅出问题所在啦!你当前代码里用了Write-Host "$_,$linesInFile",但Write-Host是专门把内容输出到控制台窗口的,它不会把数据传入后续的管道。而Export-Csv需要接收结构化的对象数据才能生成有效的CSV文件,管道里没数据,自然就生成空白文件了。
修正后的代码
把输出字符串改成输出自定义对象,让Export-Csv能正确处理:
$FOLDER_ROOT = "C:\Test\2019" $OUTPUT_CSV = "C:\Test\2019\Count.csv" Get-ChildItem $FOLDER_ROOT -Recurse -Include "*.csv" | ForEach-Object { $filestats = Get-Content $_.Fullname | Measure-Object -Line $linesInFile = $filestats.Lines - 1 # 输出包含文件名和行数的自定义对象,让Export-Csv能识别 [PSCustomObject]@{ FileName = $_.FullName ValidRowCount = $linesInFile } } | Export-Csv -Path $OUTPUT_CSV -NoTypeInformation
额外优化小 tips
- 如果你的CSV文件很大,
Get-Content会把整个文件读进内存,效率很低。可以改用更高效的方式统计行数,内存占用小很多:
# 用ReadCount参数一次性读取所有行,统计行数 $linesInFile = (Get-Content $_.Fullname -ReadCount 0).Count - 1 # 或者用.NET的ReadLines方法,逐行读取不占内存 $linesInFile = [System.IO.File]::ReadLines($_.FullName).Count - 1
- 可以加个异常处理,避免个别文件读取出错导致整个脚本中断:
Get-ChildItem $FOLDER_ROOT -Recurse -Include "*.csv" | ForEach-Object { try { $linesInFile = [System.IO.File]::ReadLines($_.FullName).Count - 1 [PSCustomObject]@{ FileName = $_.FullName ValidRowCount = $linesInFile Status = "统计成功" } } catch { [PSCustomObject]@{ FileName = $_.FullName ValidRowCount = $null Status = "统计失败: $($_.Exception.Message)" } } } | Export-Csv -Path $OUTPUT_CSV -NoTypeInformation
内容的提问来源于stack exchange,提问作者Ben




