过滤和合并许多大型CSV文件

时间:2016-01-05 15:43:24

标签: powershell csv

我正在尝试过滤并合并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

1 个答案:

答案 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()