【问题标题】:Export-Csv adding unwanted header double quotesExport-Csv 添加不需要的标题双引号
【发布时间】:2019-01-30 14:59:39
【问题描述】:

我有一个源 CSV 文件(没有标题,所有列由逗号分隔),我正在尝试根据第一列中的值将其拆分为单独的 CSV 文件,并使用该列值作为输出文件名.

输入文件:

S00000009,2016,M04 01/07/2016,0.00,0.00,0.00,0.00,0.00,0.00,750.00,0.00,0.00 S00000009,2016,M05 01/08/2016,0.00,0.00,0.00,0.00,0.00,0.00,600.00,0.00,0.00 S00000009,2016,M06 01/09/2016,0.00,0.00,0.00,0.00,0.00,0.00,600.00,0.00,0.00 S00000010,2015,W28 05/10/2015,2275.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00 S00000010,2015,W41 04/01/2016,0.00,0.00,0.00,0.00,0.00,0.00,568.75,0.00,0.00 S00000010,2015,W42 11/01/2016,0.00,0.00,0.00,0.00,0.00,0.00,568.75,0.00,0.00 S00000012,2015,W10 01/06/2015,0.00,0.00,0.00,0.00,0.00,0.00,650.00,0.00,0.00 S00000012,2015,W11 08/06/2015,0.00,0.00,0.00,0.00,0.00,0.00,650.00,0.00,0.00 S00000012,2015,W12 15/06/2015,0.00,0.00,0.00,0.00,0.00,0.00,650.00,0.00,0.00

我的 PowerShell 脚本如下所示:

Import-Csv INPUT_FILE.csv -Header service_id,year,period,cash_exp,cash_inc,cash_def,act_exp,act_inc,act_def,comm_exp,comm_inc,comm_def |
    Group-Object -Property "service_id" | 
    Foreach-Object {
        $path = $_.Name + ".csv";
        $_.group | Export-Csv -Path $path -NoTypeInformation
    }

输出文件:

S00000009.csv:

"service_id","year","period","cash_exp","cash_inc","cash_def","act_exp","act_inc","act_def","comm_exp","comm_inc","comm_def"
"S00000009","2016","M04 01/07/2016","0.00","0.00","0.00","0.00","0.00","0.00","750.00","0.00"," 0.00"
"S00000009","2016","M05 01/08/2016","0.00","0.00","0.00","0.00","0.00","0.00","600.00","0.00"," 0.00"
"S00000009","2016","M06 01/09/2016","0.00","0.00","0.00","0.00","0.00","0.00","600.00","0.00"," 0.00"

S00000010.csv:

"service_id","year","period","cash_exp","cash_inc","cash_def","act_exp","act_inc","act_def","comm_exp","comm_inc","comm_def"
"S00000010","2015","W28 05/10/2015","2275.00","0.00","0.00","0.00","0.00","0.00","0.00","0.00"," 0.00"
"S00000010","2015","W41 04/01/2016","0.00","0.00","0.00","0.00","0.00","0.00","568.75","0.00"," 0.00"
"S00000010","2015","W42 11/01/2016","0.00","0.00","0.00","0.00","0.00","0.00","568.75","0.00"," 0.00"

它正在使用第 1 列 (service_id) 中的标题值生成新文件。 有2个问题。

  1. 输出的 CSV 文件包含一个我不需要的标题行。
  2. 这些列用我不需要的双引号括起来。

【问题讨论】:

标签: powershell csv header export-csv


【解决方案1】:

首先,.csv 文件需要标题和引号作为 csv 文件结构。但是,如果您不想要它们,则可以继续使用文本文件或...

$temp = Import-Csv INPUT_FILE.csv -Header service_id,year,period,cash_exp,cash_inc,cash_def,act_exp,act_inc,act_def,comm_exp,comm_inc,comm_def | Group-Object -Property "service_id" | 
        Foreach-Object {
        $path=$_.name+".csv"
        $temp0 = $_.group | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
        $temp1 = $temp0.replace("""","")
        $temp1 > $path

        }

但此输出不是“真实”的 csv 文件。 希望对您有所帮助。

【讨论】:

  • 感谢 Stef,效果很好,输出文件的格式很好。是否可以强制将新创建的 .csv 文件输出到不同的文件夹 - 它默认为当前文件夹。我尝试在 $path=$_.name+".csv" 行上指定一个子文件夹 我尝试了类似 $out_file=\output\$_.name+".csv"
  • 我已经修复了最后一个问题(我已经将 outpath 定义为子文件夹)$path=$out_path+'\'+$_.name+".csv"
【解决方案2】:

对于您的特定场景,您可能会使用更简单的方法。将输入文件读取为纯文本文件,通过拆分第一个字段对行进行分组,然后将组写入以组命名的输出文件:

Get-Content 'INPUT_FILE.csv' |
    Group-Object { $_.Split(',')[0] } |
    ForEach-Object { $_.Group | Set-Content ($_.Name + '.csv') }

【讨论】:

    【解决方案3】:

    另一种解决方案,

    • 不使用命名的标题,而只使用数字(因为它们无论如何都不需要在输出中)
    • 避免不必要的临时文件。
    • 仅删除分隔双引号的字段。

    Import-Csv INPUT_FILE.csv -Header (1..12) | 
      Group-Object -Property "1" | Foreach-Object {
        ($_.Group | ConvertTo-Csv -NoType | Select-Object -Skip 1).Trim('"') -replace '","',',' | 
           Set-Content -Path ("{0}.csv" -f $_.Name) 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-02
      • 2014-04-24
      • 2018-12-16
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2016-11-17
      • 2016-02-08
      相关资源
      最近更新 更多