【问题标题】:Filtering and Merging Many Large CSV Files [closed]过滤和合并许多大型 CSV 文件 [关闭]
【发布时间】:2016-04-09 12:13:18
【问题描述】:

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

【问题讨论】:

  • 您能否提供两个 csv 文件的样本,并更明确地解释您想要过滤和合并的内容?
  • 输出是否只有 8010 开启的 3 行?
  • @Nathan_Sav。是的,我只想将这三行写入文件。以及来自其他 300 个文件的类似行。

标签: powershell csv


【解决方案1】:

从性能的角度来看,您可能希望避免使用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()

【讨论】:

  • 它不喜欢下一行的-file 部分,但我让它工作了。谢谢 ! Get-ChildItem $inputFolder -File | Where-Object
  • @BenjaminB 那么您仍在使用 PowerShell v2 并且应该升级。同时,您可以通过将$_.PSIsContainer 添加到Where-Object 条件来过滤文件。
  • -not $_.PSIsContainer 我的意思是。
猜你喜欢
  • 2015-04-01
  • 2021-12-11
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
相关资源
最近更新 更多