Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何根据行值分割CSV文件_File_Powershell_Csv_Split - Fatal编程技术网

File 如何根据行值分割CSV文件

File 如何根据行值分割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

下面只是一个例子,我看到很多脚本将.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

如果我正确理解了你的问题,像这样的方法应该会奏效:

$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;*线路。