我正在尝试过滤并合并300+ 50,000kb(500k行)的csv文件,然后将它们输出到另一个csv文件中。基于列中的一个或多个值完成过滤。我试图找到几个不同的例子,但没有任何内容包括过滤,合并/追加,以及不将数据保存在内存中。
例如,我想合并INV_ITEM_ID 8010的所有记录。
所有CSV文件格式相同,需要以相同方式过滤。
RUN_DATE |FORECAST_SET |INV_ITEM_ID |FORECAST_DATE |FORECAST_QTY
------------------------------------------------------------------------
26-Mar-15 |A |4162 |11/19/2016 | 100
26-Mar-15 |A |8010 |11/19/2016 | 100
26-Mar-15 |A |4162 |11/19/2016 | 100
26-Mar-15 |B |4162 |11/19/2016 | 100
26-Mar-15 |B |4162 |11/19/2016 | 100
26-Mar-15 |B |8010 |11/19/2016 | 100
26-Mar-15 |B |4162 |11/19/2016 | 100
26-Mar-15 |B |8010 |11/19/2016 | 100
答案 0 :(得分:0)
从性能的角度来看,您可能希望避免Import-Csv
/ Export-Csv
并采用StreamReader
/ StreamWriter
方法。像这样:
$inputFolder = 'C:\some\folder'
$outputFile = 'C:\path\to\output.csv'
$writer = New-Object IO.StreamWriter ($outputFile, $false)
Get-ChildItem $inputFolder -File | Where-Object {
... # <-- filtering criteria for selecting input files go here
} | ForEach-Object {
$reader = New-Object IO.StreamReader ($_.FullName)
if (-not $headerWritten) {
# copy header line to output file once
$writer.WriteLine($reader.ReadLine())
$headerWritten = $true
} else {
# discard header line
$reader.ReadLine()
}
while ($reader.Peek() -ge 0) {
$line = $reader.ReadLine()
$fields = $line -split ','
if (...) { # <-- filtering criteria for selecting output lines go here
$writer.WriteLine($line)
}
}
$reader.Close()
$reader.Dispose()
}
$writer.Close()
$writer.Dispose()