我正在尝试读取一组|
管道分隔的文本文件,并获取每个文件的特定列中的唯一值的数量,以及文件中的行数。我尝试使用Import-CSV
,但这需要花费数小时而耗费大量内存。文件范围从20MB到500MB,10-15个文件。
使用流阅读器会更快吗?我如何计算独特的价值?
Get-ChildItem .\*filtered.txt -Name |
ForEach-Object {
if($dayofweek -eq 1) {
$importFile = Import-Csv $_ -Delimiter '|'
} else {
$importFile = Import-Csv $_ -Delimiter '|' -Header @("a", "Order-ID", "c", "d", "e", "f", "g", "h")
}
$numRows = $importFile | Measure-Object | Select-Object -expand count
$numUniqueOrderID = $importFile | Select Order-ID -Unique
echo "Filename: $_ `t Rows: $numRows `t"
echo "Unique Order-IDs"
$numUniqueOrderID
echo `n
}
答案 0 :(得分:0)
Streamreader将快十万倍。因此,我们的想法是使用Streamreader将数据存入内存,然后执行$data = ConvertFrom-Csv -InputObject $result
。然后,您可以执行类似Sort-Object -unique
的操作或添加-Property
进行排序。
编辑:或者,如果你不想弄乱Streamreader,你可以使用$content = Get-Content $file -ReadCount 0
,是的,你会失去0.01%的效率,但为什么要这么麻烦。
答案 1 :(得分:0)
没有确定性
Get-ChildItem .\*filtered.txt -File |
% {
if($dayofweek -eq 1)
{$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' | Select Order-ID -Unique).Count}
else
{$numUniqueOrderID = (Import-Csv $_.FullName -Delimiter '|' -Header "a", "Order-ID", "c", "d", "e", "f", "g", "h" | Select Order-ID -Unique).Count}
$numRows = (gc $_.FullName -ReadCount 0).Count
write-host ("Filename: {0}`t Rows : {1}`nUnique Order-IDs : {2}`n" -f $_, $numRows, $numUniqueOrderID)
}