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