【问题标题】:PowerShell CSV, take a specific row from each line and combine it into one CSVPowerShell CSV,从每一行中取出特定行并将其合并为一个 CSV
【发布时间】:2021-01-23 03:55:15
【问题描述】:

我在一个目录中有 300 个 CSV 文件。

我想从每个 CSV 中获取一个特定条件,然后使用 PowerShell 将其放入另一个条件中。

这是我的线路,但似乎不起作用。

Get-ChildItem -Filter "*Results.csv" | Get-Content | Where-Object {$_.NAME -eq "Cage,Johnny"} | Add-Content "test.csv"

我使用 gci 在我的目录中过滤了我想要的特定 CSV,使用 Get-Content 获取每个的内容,并且在 NAME 列中的值为 Johnny Cage,并将内容添加到 test.csv 文件中,但没有不行。 任何帮助都会很棒!

【问题讨论】:

  • Get-Content 不会将文本转换为具有属性的自定义对象。为此,您需要Import-CSV

标签: powershell cmd


【解决方案1】:

您需要将 CSV 文本反序列化为具有可引用属性的对象。然后您可以比较Name 属性。如果您的所有 csv 文件具有相同的标题,您可以执行以下操作。

Get-ChildItem -Filter "*Results.csv" | Foreach-Object {
    Import-Csv $_.FullName |
        Where-Object {$_.NAME -eq "Cage,Johnny"} } |
            Export-Csv "test.csv"

如果您的 CSV 文件包含不同的标题,那么您有几个选择。一,您可以创建包含所有文件中存在的所有可能标题的输出 CSV(或者只是您想要的标题,只要它们在所有文件中都相同)。其次,您可以只输出数据行,但 CSV 文件已损坏。

# Broken CSV Approach
Get-ChildItem -Filter "*Results.csv" | Foreach-Object {
    Import-Csv $_.FullName |
        Where-Object {$_.NAME -eq "Cage,Johnny"}} | Foreach-Object {
            $_ | ConvertTo-Csv -Notype | Select-Object -Skip 1
        } | Add-Content test.csv

【讨论】:

  • 感谢您,您的解释清晰准确。
  • 我今天试过了,但它似乎没有用..我真的以为它会。我收到一条错误消息“Import-Csv:您必须指定 -Path 或 -LiteralPath 参数,但不能同时指定两者。” .. 似乎在 Import-Csv + 上失败了
  • @PeterHui 我更新了代码。请注意,PowerShell Core 没有需要通过管道连接到 Foreach-Object 的错误。
  • 我尝试使用 Power Query 进行此练习,但出现数据错误。我尝试在 R 中使用 vroom 执行此操作,但出现列不匹配错误。我试过做同样的 w 电源自动化,但不知道如何让它工作。 Power Shell 只是通过一些小故障排除来做到这一点。感谢您的帮助!
【解决方案2】:

我想我明白了。

Get-ChildItem  -Filter *Results.csv |
    ForEach-Object{
        Import-Csv $_.NAME | ? { $_.EMPLID -eq "Cage,Johnny"}
    } | Export-Csv "test.csv"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 2021-07-07
    • 2019-01-09
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多