powershell - 如何解析csv文件,查找触发器并使用Powershell拆分为新文件

标签 powershell csv split

我有一个结构如下的CSV文件:

"SA1";"21020180123155514000000000000000002"
"SA2";"21020180123155514000000000000000002";"210"
"SA4";"21020180123155514000000000000000002";"210";"200000001"
"SA5";"21020180123155514000000000000000002";"210";"200000001";"140000001";"ZZ"
"SA1";"21020180123155522000000000000000002"
"SA2";"21020180123155522000000000000000002";"210"
"SA4";"21020180123155522000000000000000002";"210";"200000001"
"SA5";"21020180123155522000000000000000002";"210";"200000001";"140000671";"ZZ"
"SA1";"21020180123155567000000000000000002"
"SA2";"21020180123155567000000000000000002";"210"
"SA4";"21020180123155567000000000000000002";"210";"200000001"
"SA5";"21020180123155567000000000000000002";"210";"200000001";"140000001";"ZZ"

因此,第二个字段中的“值”(分隔符“;”)标记了属于一起的数据,并且值140000001或140000671是触发器。
因此结果应为:

第一个文件:140000001.txt
"SA1";"21020180123155514000000000000000002"
"SA2";"21020180123155514000000000000000002";"210"
"SA4";"21020180123155514000000000000000002";"210";"200000001"
"SA5";"21020180123155514000000000000000002";"210";"200000001";"140000001";"ZZ"
"SA1";"21020180123155567000000000000000002"
"SA2";"21020180123155567000000000000000002";"210"
"SA4";"21020180123155567000000000000000002";"210";"200000001"
"SA5";"21020180123155567000000000000000002";"210";"200000001";"140000001";"ZZ"

第二个文件:140000671.txt
"SA1";"21020180123155522000000000000000002"
"SA2";"21020180123155522000000000000000002";"210"
"SA4";"21020180123155522000000000000000002";"210";"200000001"
"SA5";"21020180123155522000000000000000002";"210";"200000001";"140000671";"ZZ"

现在,我发现了一个片段,该片段按第二个字段分割了大文件:
$src = "C:\temp\ORD001.txt"
$dstDir = "C:\temp\files\"
Remove-Item -Path "$dstDir\\*"

$header = Get-Content -Path $src | select -First 1

Get-Content -Path $src | select -Skip 1 | foreach {
    $file = "$(($_ -split ";")[1]).txt"
    Write-Verbose "Wrting to $file"
    $file = $file.Replace('"',"")
    if (-not (Test-Path -Path $dstDir\$file))
    {
        Out-File -FilePath $dstDir\$file -InputObject $header -Encoding ascii
    }
    $file -replace '"', ""
    Out-File -FilePath $dstDir\$file -InputObject $_ -Encoding ascii -Append
}

对于其余的我站在黑暗中。
请帮忙。

最佳答案

如果您还不知道Import-CSV cmdlet,它将在这里工作。我会用它,因为它将所有行作为数组中的不同对象返回,其属性为列值。而且您不必手动删除引号等。假设第二列是日期时间值,并且对于每组4个连续行应该是唯一的,那么它将起作用:

$src = "C:\temp\ORD001.txt"
$dstDir = "C:\temp\files\"
Remove-Item -Path "$dstDir\*"
$csv = Import-CSV $src -Delimiter ';'
$DateTimeGroups = $csv | Group-Object -Property 'ColumnTwoHeader'
foreach ($group in $DateTimeGroups) {
    $filename = $group.Group.'ColumnFiveHeader' | select -Unique
    $group.Group | Export-CSV "$dstDir\$filename.txt" -Append -NoTypeInformation
}

但是,如果第二列和第五列的两个“4个连续行的组”中的两个具有相同的值,则这将中断。除非您确定每个时间组中始终有4个连续的行,否则无法解决此问题。在这种情况下:
$src = "C:\temp\ORD001.txt"
$dstDir = "C:\temp\files\"
Remove-Item -Path "$dstDir\*"
$csv = Import-CSV $src -Delimiter ';'
if ($csv.count % 4 -ne 0) {
    Write-Error "CSV does not have a proper number of rows. Attempting to continue will be bad :)"
    return
}
for ($i = 0 ; $i -lt $csv.Count ; $i=$i+4) {
    $group = $csv[$i..($i+4)]
    $group | Export-Csv "$dstDir\$($group[3].'ColumnFiveHeader').txt" -Append -NoTypeInformation
}

只需确保将Column2HeaderColumn5Header替换为适当的值即可。

关于powershell - 如何解析csv文件,查找触发器并使用Powershell拆分为新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49108915/

相关文章:

PowerShell - 删除所有文本文件行,直到找到某个字符串

windows - 如何在Windows中的PowerShell中启动Boot2Docker?

python - 如何向目录中的所有 CSV 文件批量添加列标题并保留这些文件?

python - 从导致值错误的 CSV 文件将数据添加到 Pandas Dataframe

python - pandas read_csv 删除空白行

python - 在python中以一定间隔从右边拆分一个字符串

JavaScript 用空格分割字符串

powershell - Import-DscResource 找不到包 cChoco

java - 使用 powershell 创建防火墙规则

python - 如何在 Python 中拆分和解析字符串?