【问题标题】:How to seperate CSV values within a CSV into new rows in PowerShell如何将 CSV 中的 CSV 值分隔到 PowerShell 中的新行中
【发布时间】:2019-09-03 16:03:56
【问题描述】:

我从一个无法修改为 CSV 的系统收到一份自动报告。我正在使用 PowerShell 将 CSV 拆分为多个文件并解析出所需的特定数据。 CSV 包含的列可能不包含数据、1 个值或在 CSV 文件本身中以逗号分隔的多个值。

示例(为清楚起见已更新):

"Group","Members"  
"Event","362403"  
"Risk","324542, 340668, 292196"  
"Approval","AA-334454, 344366, 323570, 322827, 360225, 358850, 345935"  
"ITS","345935, 358850"  
"Services",""  

我希望数据每行有一个这样的条目(为清晰而更新):

"Group","Members"  
"Event","362403"  
"Risk","324542"  
"Risk","340668"  
"Risk","292196"  
#etc.

我尝试拆分数据,但最后得到的列数未知。

我尝试了foreach 循环,但似乎无法正确处理(下面的伪代码):

Import-CSV $Groups
ForEach ($line in $Groups){
    If($_.'Members'.count -gt 1, add-content "$_.Group,$_.Members[2]",)}

感谢您提供的任何帮助。我已经搜索了所有 stackexchange 帖子并使用了 Google,但找不到可以解决这个确切问题的内容。

【问题讨论】:

  • 我已经更新了源代码和输出以获得更好的清晰度。

标签: powershell csv


【解决方案1】:
Import-Csv .\input.csv | ForEach-Object {
    ForEach ($Member in ($_.Members -Split ',')) {
        [PSCustomObject]@{Group = $_.Group; Member = $Member.Trim()}
    }
} | Export-Csv .\output.csv -NoTypeInformation

【讨论】:

    【解决方案2】:
    # Get the raw text contents
    $CsvContents = Get-Content "\path\to\file.csv"
    
    # Convert it to a table object
    $CsvData = ConvertFrom-CSV -InputObject $CsvContents
    
    # Iterate through the records in the table
    ForEach ($Record in $CsvData) {
        # Create array from the members values at commas & trim whitespace
        $Record.Members -Split "," | % {
            $MemberCount = $_.Trim()
            # Check if the count is greater than 1
            if($MemberCount -gt 1) {
                # Create our output string
                $OutputString = "$($Record.Group), $MemberCount"
                # Write our output string to a file
                Add-Content -Path "\path\to\output.txt" -Value $OutputString
            }
        }
    }
    

    这应该可行,您的想法是正确的,但我认为您可能遇到了一些语法问题。如果您有任何问题,请告诉我:)

    【讨论】:

    • 谢谢,这让我完成了 99% 的工作。出于某种原因,如果成员编号以零开头,则它不包含输出中的值。例如,我有一个“CBF”、“09091,039600”,它根本没有得到输出,而“LAB”、“3394177,081593、112796、200741”包括除以零开头的条目之外的所有条目。
    【解决方案3】:

    根据您更新的问题修改了代码,

    $List = Import-Csv "\path\to\input.csv"
    
    foreach ($row in $List) {
        $Group = $row.Group
        $Members = $row.Members -split ","
    
        # Process for each value in Members
        foreach ($MemberValue in $Members) {
            # PS v3 and above
            $Group + "," + $MemberValue | Export-Csv "\path\to\output.csv" -NoTypeInformation -Append
            # PS v2
            # $Group + "," + $MemberValue | Out-File "\path\to\output.csv" -Append
        }
    }
    

    【讨论】:

    • 谢谢,这让我完成了 99% 的工作,但问题与其他解决方案相同。出于某种原因,如果成员编号以零开头,则它不包含输出中的值。例如,我有一个“CBF”、“09091,039600”,它根本没有得到输出,而“LAB”、“3394177,081593、112796、200741”包括除以零开头的条目之外的所有条目。
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2022-08-14
    • 2014-08-14
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2015-09-24
    相关资源
    最近更新 更多