【问题标题】:How to split a CSV file depending of row values如何根据行值拆分 CSV 文件
【发布时间】:2015-01-09 16:10:20
【问题描述】:

以下只是一个示例,我已经看到很多将 .CSV 文件分解为较小文件的脚本,但在这方面遇到了困难。

我们如何使用 PowerShell,找到由 ALPH 指示的标头,获取每个后续​​行,在到达 ALPT(包括)时停止并将此文本放入另一个文件中。 该操作需要遍历整个文件,并且 ALPD 或 ALPC 行的数量会有所不同。

ALPH 可以被视为一个标题,而包含的信息是必需的,因为某些字段值可能不同。唯一的常数是 ALPH 和 ALPT。

ALPH;8102014
ALPC;PK
ALPD;50
ALPD;40
ALPT;5
ALPH;15102014
ALPC;PK
ALPD;50
ALPD;50
ALPD;70
ALPD;70
ALPD;71
ALPD;72
ALPD;40
ALPT;6
ALPH;15102014
ALPC;PK
ALPD;50
ALPD;50
ALPD;40
ALPT;6

【问题讨论】:

  • 你需要'ALPH;'后面的数字吗?
  • 每次都是完整的行。例如:ALPH,08102014 ALPC,PK ALPD,50 ALPD,40 ALPT,5 但是 JPBlanc 提供了一个工作脚本 - 谢谢我会用更多数据进行测试,如果发现任何问题,我会返回谢谢
  • 是的,我找到了一种使用 -split 的非常快速的方法,但它省略了 ALPH;* 行。

标签: file powershell csv split


【解决方案1】:

如果我正确理解了你的问题,这样的事情应该可以工作:

$csv     = 'C:\path\to\your.csv'
$pattern = 'ALPH[\s\S]*?ALPT.*'
$cnt     = 0

[IO.File]::ReadAllText($csv) | Select-String $pattern -AllMatches |
  select -Expand Matches | select -Expand Groups | 
  % {
    $cnt++
    $outfile = Join-Path (Split-Path $csv -Parent) "split${cnt}.csv"
    [IO.File]::WriteAllText($outfile, $_.Value)
  }

【讨论】:

    【解决方案2】:

    这是一种使用开关的方法。您的原始文件位于C:\temp\ALPH.CSV,这是我想象的找到开始和结束的方式。

    $n = 1
    switch -File 'C:\temp\ALPH.CSV' -Regex
    {
      '^ALPH.*' {
        Write-Host "Begin $n"
      }
      '^ALPT.*' {
        Write-Host "End $n"
        $n++
      }
    }
    

    现在将行保存到 var 并导出文件:

    $n = 1
    $csvTmp = @()
    switch -File 'C:\temp\ALPH.CSV' -Regex
    {
      '^ALPH.*' {
        Write-Host "Begin $n"
        $csvTmp += $_
      }
      '^ALPT.*' {
        Write-Host "End $n"
        $csvTmp += $_
        $csvTmp | Set-Content "c:\temp\file$n.csv"
        $csvTmp = @()
        $n++
      }
      default {
        $csvTmp += $_
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-10
      • 2015-03-06
      • 2014-01-10
      • 2018-11-09
      • 2020-05-20
      • 1970-01-01
      • 2015-09-03
      • 2012-04-14
      • 2022-01-12
      相关资源
      最近更新 更多