none
Export-csvのダブルクオーテーションについて

    質問

  • お世話になります。
    CSVファイルを読み込んで必要な列のみCSVファイル
    で出力するプログラムを作成しています。
    CSVファイルを読み込んでExport-Csvで出力すると
    なぜかすべての値にダブルクォーテーション(")がついています。

    元々は文字列は(")がついていて、数字はついていません。

    文字列の行は(")がついていてもいいのですが数字の列だけ
    はついていてはまずいのです。
    どうすれば、よいでしょうか?ご教授お願いします。
    下記の環境を想定しています。
    データ取得 Get-Content ConvertFrom-Csv
    powershell バージョン2
    win7
    2017年2月27日 2:19

回答

  • こんにちは。

    Export-Csvはすべてのカラムに必ずダブルクオートを付ける仕様なので、ダブルクオートを付けたくない列がある場合は他の方法を採るしかありません。

    方法はいろいろありますが、とりあえず思いつくのはForEach-ObjectとOut-Fileを使う方法でしょうか。

    かなり適当な例ですが、一例をあげておきます。

    # Get-ProcessのところはGet-Contentに置き換えてください。
    Get-Process | Select-Object Name, VM, WS, ProcessName -First 10 `
      | ForEach-Object { "`"$($_.Name)`"", $_.VM, $_.WS, "`"$($_.ProcessName)`"" -join ',' } `
      | Out-File .\sample.csv

    この例では、NameとProcessNameにだけダブルクオートを付ける様にしています。


    2017年2月27日 3:49
  • チャブーンです。

    すごく単純なものでよければ、したのstackoverflowのコードが参考になるのではないでしょうか?

    http://stackoverflow.com/questions/24074205/convertto-csv-output-without-quotes

    $cont=get-content .\import.csv | convertfrom-csv
    $cont | convertto-csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file .\export.csv


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年2月27日 4:44

すべての返信

  • こんにちは。

    Export-Csvはすべてのカラムに必ずダブルクオートを付ける仕様なので、ダブルクオートを付けたくない列がある場合は他の方法を採るしかありません。

    方法はいろいろありますが、とりあえず思いつくのはForEach-ObjectとOut-Fileを使う方法でしょうか。

    かなり適当な例ですが、一例をあげておきます。

    # Get-ProcessのところはGet-Contentに置き換えてください。
    Get-Process | Select-Object Name, VM, WS, ProcessName -First 10 `
      | ForEach-Object { "`"$($_.Name)`"", $_.VM, $_.WS, "`"$($_.ProcessName)`"" -join ',' } `
      | Out-File .\sample.csv

    この例では、NameとProcessNameにだけダブルクオートを付ける様にしています。


    2017年2月27日 3:49
  • チャブーンです。

    すごく単純なものでよければ、したのstackoverflowのコードが参考になるのではないでしょうか?

    http://stackoverflow.com/questions/24074205/convertto-csv-output-without-quotes

    $cont=get-content .\import.csv | convertfrom-csv
    $cont | convertto-csv -NoTypeInformation -Delimiter "," | % {$_ -replace '"',''} | out-file .\export.csv


    フォーラムは有償サポートとは異なる「コミュニティ」です。フォーラムでご質問頂くにあたっての注意点 をご一読のうえ、お楽しみください。

    2017年2月27日 4:44
  • ご返信ありがとうございます。
    大変助かります。初心者ですので
    "`" これの意味が理解できません。
    $($_.Name)ここまでは理解できます。

    `はなんと読むのでしょうか?教えていただけると助かります。

    "`"$($_.Name)`""
    2017年2月27日 6:25
  • バッククオートですね。PowerShellにおいては、"" リテラル文字列において一部文字をエスケープする際に使用されています。

    "" 文字列の中で"を記述すると、それが文字としての"なのか文字列を終了するための"なのか判断できないので、`"とエスケープすることで、それが文字としての"であると指示します。

    2017年2月27日 6:37
  • "`" はバッククオートです。

    PowerShellで""で囲われた文字列の中で " を表現するのに使います。

    実例はこちらを見てもらうのが良いかと思います。

    PS C:\> Write-Output "Hello"
    Hello
    PS C:\> Write-Output "`"Hello`""
    "Hello"


    2017年2月27日 6:37

  • stknohg様
    チャブーン様
    Hongliang様

    理解できて問題解決できました。

    ありがとうございました。

    2017年2月27日 7:06