我有来自数据记录器的csv数据,它每秒收集信息而不是每15分钟收集一次信息,我制作了一个脚本来导出每900个条目。该脚本适用于较小的csv文件(最大80mb)。但我有一个3.6GB的文件,它没有用。
我在线查看并找到了更好的方法来提高速度(没有.net,并且还没有能够让stream.reader工作)。
这是脚本:
$file = Import-Csv z:\csv\input_file.csv -Header A,B,C,D,E,F
$counter = 0
ForEach ($item in $file)
{
$counter++
If($counter -lt 900)
{
}
Else{
Write-Output “$item” | Out-File "z:\csv\output_file.csv" -Append
$counter=0
}
}
非常感谢任何想法/优化。
感谢。
答案 0 :(得分:0)
您可以跳过将其作为CSV阅读,并将其作为文本阅读。然后循环迭代900次,并输出这些行。
categories
我确定可能会进行其他优化,但这是加快速度的简单方法。
编辑:好的,所以$file = Get-Content z:\csv\input_file.csv -ReadCount 1000
For($i=0; $i -le $file.count;$i=$i+900){
$file[$i] | Add-Content z:\csv\output_file.csv
}
的行为与我预期的略有不同。当设置为0或1以外的数字时,它会创建一个字符串数组。所以,基本上-ReadCount
,此时有两个选项......要么一次使用[array[string[]]]
来读取整个文件,要么一次最好读取900行只是每组中的第一个,并将其直接传递到管道-ReadCount 0
。
Set-Content
这样一次将文件读入内存900行,然后只传递管道中每个系列的第一行,并将其输出到输出文件。