如何根据行值拆分CSV文件

时间:2014-11-12 17:45:52

标签: file powershell csv split

下面只是一个例子,我看过很多脚本可以在较小的文件中分解.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

2 个答案:

答案 0 :(得分: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)
  }

答案 1 :(得分:0)

这是一种使用开关的方法。您的原始文件位于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 += $_
  }
}