我有大量CSV文件,这些文件都很大,我使用PowerShell创建一个脚本来检查记录中每行的任何错误计数列。以前我在Get-Content
,Import-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插入记录。因此文件大小非常大,可能包含错误。
答案 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>}