You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

统计文件夹中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

火山引擎 最新活动