如何解析csv文件,查找触发器并使用PowerShell拆分成新文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解析csv文件,查找触发器并使用PowerShell拆分成新文件相关的知识,希望对你有一定的参考价值。

我有一个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是触发器。所以结果应该是:

第1个圆角:140000001.http

"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:	empORD001.txt"
$dstDir = "C:	empfiles"
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:	empORD001.txt"
$dstDir = "C:	empfiles"
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:	empORD001.txt"
$dstDir = "C:	empfiles"
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

另一答案

如果性能不是问题,将Import-Csv / Export-CsvGroup-Object结合使用,可以使用PowerShell将CSV转换为对象并返回的能力,最简洁,直接地表达您的意图:

$src =    "C:	empORD001.txt"  # Input CSV file
$dstDir = "C:	empfiles"       # Output directory

# Delete previous output files, if necessary.
Remove-Item -Path "$dstDir*" -WhatIf

# Import the source CSV into custom objects with properties named for the columns.
# Note: The assumption is that your CSV header line defines columns  "Col1", "Col2", ...
Import-Csv $src -Delimiter ';' | 
  # Group the resulting objects by column 2
  Group-Object -Property Col2 | 
    ForEach-Object {  # Process each resulting group.
      # Determine the output filename via the group's last row's column 5 value.
      $outFile = '{0}{1}.txt' -f $dstDir, $_.Group[-1].Col5
      # Append the group at hand to the target file.
      $_.Group | Export-Csv -Append -Encoding Ascii $outFile -Delimiter ';' -NoTypeInformation
    }

注意:

  • 假设 - 与您的示例数据一致 - 是它始终是共享相同列2值的一组行中的最后一行,其列5包含输出文件名的根(例如,140000001
另一答案

对不起,但我没有标题栏。它是一个以分号分隔的接口文本文件

以上是关于如何解析csv文件,查找触发器并使用PowerShell拆分成新文件的主要内容,如果未能解决你的问题,请参考以下文章

如何上传csv文件并解析它?

如何使用熊猫在特定列中的csv文件中查找特定单词

如何将 .csv 文件中的数据转换为 NumPy 数组并使用统计数据来查找数据的平均值? [复制]

如何解析 CSV 文件,以便可以被 Mahout 分类

自动填充侦听器和 keyup 触发器上的 JQuery 语法错误,同时循环并查找顺序命名的输入

如何解析 CSV 并导入到 MYSQL 问题