【问题标题】:Powershell script to convert comma separated values into rows and output as new CSV file用于将逗号分隔值转换为行并输出为新 CSV 文件的 Powershell 脚本
【发布时间】:2020-05-21 18:38:20
【问题描述】:

我有一个 csv 文件,其中包含逗号分隔值的单元格。我正在尝试将逗号分隔值拆分为行。我在下面放了输入和期望输出的例子

这是 CSV 文件

Name |      Role  
John |      physics,chemistry  
Ram  |      chemistry ,maths

这就是我处理后数据的方式

- Name | Role 

- John | Physics  

- John | Chemistry

- Ram  | Chemistry

- Ram  | Maths

【问题讨论】:

  • 请向我们展示输入 csv 文件的真实前三行,而不是您在问题中格式化的内容。

标签: powershell


【解决方案1】:

在 utf-8 csv 标准版本中,当以纯文本形式查看时,行会显示为这样

姓名角色
约翰,“物理、化学”
拉姆,“化学、数学”
鲍勃,数学"
玛丽,“物理、化学、数学”

那么下面的代码应该可以工作

$csvFilePath = "My.csv"

$table=@()
$csv= import-csv $csvFilePath
foreach($row in $csv){
    if($row.Role -like "*,*"){
        $roles=$row.Role.split(",")
        foreach($role in $roles){
            $table+=[pscustomobject]@{
                Name=$row.name
                Role=$role.trim()
             }
        }
    }
    else{
    $table+=$row
    }
}

这会产生

名称角色


约翰物理学
约翰化学
拉姆化学
拉姆数学
鲍勃数学
玛丽物理学
玛丽化学 玛丽数学

【讨论】:

  • 如果文件名每天都根据 datetimestamp 变化,请知道如何设置 csvfilepath
  • 您有文件名或文件路径的示例吗?它们是文件夹中唯一的东西吗?您可以使用 get-date docs.microsoft.com/en-us/powershell/module/…
  • 另外,如果它对您有用,请将其标记为有用,以便它可以排在最佳答案中。
  • 嗨 Zach,当我调试代码时,$table 已完美拆分所有值,但不知道如何将此 $table 输出到带有新拆分数据的新 CSV 文件,请告诉我,如何做到这一点?
  • 不确定如何将此答案标记为有用,还没有声誉
【解决方案2】:

以下脚本在PowerShell -version 2(原标记powershell-2.0)或以上运行顺利:

$CsvObject = @'
Name|Role
John|physics,chemistry
Ram|chemistry,maths
Joe|biology
'@ | ConvertFrom-Csv -Delimiter '|'
$CsvObjectNew = foreach ($CsvLine in $CsvObject ) {
    $CsvLine.Role -split ',' | ForEach-Object {
        ### PowerShell -version 2.0 or above
        New-Object PSCustomObject -Property @{
            Name = $CsvLine.Name
            Role = $_
        }
    }
}
$CsvObjectNew |
    ConvertTo-Csv -Delimiter '|' -NoTypeInformation
'--- or ---'
($CsvObjectNew |
    ConvertTo-Csv -Delimiter '|' -NoTypeInformation |
        Out-String ) -replace '"'

输出D:\PShell\SO\61941506.ps1

"Name"|"Role"
"John"|"physics"
"John"|"chemistry"
"Ram"|"chemistry"
"Ram"|"maths"
"Joe"|"biology"
--- or ---
Name|Role
John|physics
John|chemistry
Ram|chemistry
Ram|maths
Joe|biology

PowerShell -version 3或以上,你可以缩短

        New-Object PSCustomObject -Property @{
            Name = $CsvLine.Name
            Role = $_
        }

使用[PSCustomObject]type accelerator编码sn-p如下:

    [PSCustomObject]@{
        Name = $CsvLine.Name
        Role = $_
    }

【讨论】:

    【解决方案3】:

    $details= Import-Csv -Path "sample.csv"
        foreach ($line in $details){
            $splitRole= ($line.Role).Split(",")
            foreach($role in $splitRole){
    
            Write-host $line.Name $role
    
        }
    }
    

    【讨论】:

    • CSV 名称 角色 John 物理、化学 Ram 化学、数学
    • 如果您找到了解决方案,请将其作为答案
    • 可以通过添加一些关于它的工作原理和原因的解释来改进这个仅代码的答案,如果图像是必要的,它不应该缩进,因为这会导致它显示为代码而不是一张图片。
    猜你喜欢
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2012-12-02
    • 1970-01-01
    • 2014-05-24
    • 2016-08-18
    相关资源
    最近更新 更多