File 如何根据行值分割CSV文件
下面只是一个例子,我看到很多脚本将.CSV文件分解为较小的文件,但却很难做到这一点 我们如何使用PowerShell,找到由ALPH指示的标题,然后在到达ALPT(包含)时停止,并将此文本放入另一个文件中。 该操作需要在整个文件中运行,并且ALPD或ALPC行的数量会有所不同 ALPH可以被视为一个标头,而所包含的信息是必需的,因为某些字段值可能不同。唯一的常数是ALPH和ALPTFile 如何根据行值分割CSV文件,file,powershell,csv,split,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
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
如果我正确理解了你的问题,像这样的方法应该会奏效:
$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)
}
这里有一个使用开关的方法。您的原始文件位于
C:\temp\ALPH.CSV
以下是我想象的找到开始和结束的方式
$n = 1
switch -File 'C:\temp\ALPH.CSV' -Regex
{
'^ALPH.*' {
Write-Host "Begin $n"
}
'^ALPT.*' {
Write-Host "End $n"
$n++
}
}
现在将行保存到变量并导出文件:
$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 += $_
}
}
您需要“ALPH;”后面的号码吗?每次都是完整的一行。例如:ALPH,08102014 ALPC,PK ALPD,50 ALPD,40 ALPT,5然而JPBlanc提供了一个工作脚本-谢谢我将使用更多数据进行测试并返回如果我发现任何问题谢谢,我找到了一个非常快速的方法-拆分,但它忽略了ALPH;*线路。