Import-Csv性能下降

时间:2017-12-11 03:05:51

标签: powershell csv

我有大量CSV文件,这些文件都很大,我使用PowerShell创建一个脚本来检查记录中每行的任何错误计数列。以前我在Get-ContentImport-Csv,Excel COM API上提出了一些相关问题。

Count CSV columns without using Excel API

Powershell get-content ignore quoted delimiter

我按照建议使用Import-Csv,我注意到性能仍然相对非常慢。平均而言,在50k行记录上执行大约需要20分钟。

以下是Import-Csv的测试代码段:

$path = "testing.csv"
$headerlimit = @(1..15)
$result = Import-Csv $path -Header $headerlimit |
          ForEach {@($_.PSObject.Properties| Where {$_.Value -ne $Null}).Count}
$i = 0
$line = 1
foreach ($loop in $result) {
    if ($result[$i] -ne <header columns count value here>) {
        echo  "Line: $line "
        echo "Column Found:" $result[$i]
    }
    $i++
    $line++
}

问题来源是否来自我的循环语句导致性能下降或者PowerShell在执行此类任务时与其他编程语言(如C#)相比性能较慢?

参考:

Why cant PowerShell run loops fast ?

更新: 在我之前的脚本中,我记录了如下的简单细节(最终结果的示例日志,我想要实现的目标):

  > ...................#1 File Name: book2.csv, Header Cell Count: 6 ...........................

    > Row No    Column No           Result 
        > 3        9            Invalid Column Count: Found mismatch no of header column vs data column 
        > 5        6            No Data Found: No data found on this row
> Total Rows Found(Exclude Header): (5)
> Total Maximum Columns Found: (9)

我希望检查数据以确保从应用程序数据库或用户手册中正确导出的csv插入记录。因此文件大小非常大,可能包含错误。

1 个答案:

答案 0 :(得分:1)

我完全同意Ansgar Wiechers的评论;问题出现为:
你真的需要行号或实际上相关行的项目吗?
我觉得你让我们帮你重新发明轮子。

无论如何,回答你的问题:PowerShell有很多cmdlet和命令,在很多情况下你可以用一个命令做一些事情。特别是在性能存在问题的情况下,最好先查找正确的命令,然后尝试自己编程(并重新发明比本机解决方案更少的轮子)。

在这种特定情况下,使用Where-Object cmdlet,您只需检索一次未对齐的相关行:

Import-Csv $path -Header $headerlimit | 
    Where {@($_.PSObject.Properties| Where {$_.Value -ne $Null}).Count -ne <header columns count value here>}