web-dev-qa-db-ja.com

PowerShell – CSV(インポート/エクスポート)で引用符が削除されます

次のようなコンテンツを含むタブ区切りのCSVファイル(test.txt)があります(私のCSVにはヘッダーがありません)。

12.33   Apple   Orange  "this is" great "to eat"
10.99   Pear    Lemon   "this" is an - "aquired taste"

データを配列にインポートするために、次の両方を試しました。

$Headers = "price","item1","item2","desc"
[array]$arrCSVobjects = import-csv "test.txt" -Delimiter "`t" -Header $Headers

(または)

$Headers = "price","item1","item2","desc"
[array]$arrCSVobjects = Get-Content -Path "test.txt " | Out-String | ConvertFrom-CSV -Delimiter "`t" -Header $Headers

これにどのようにアプローチしても、PSは配列内のDESC要素から開始(先頭)引用符を削除したいと考え続けます(結果は次のようになります-元のデータと同じではありません):

price    item1    item2    desc
-----    -----    -----    ----
12.33    Apple    Orange   this is great "to eat"
10.99    Pear     Lemon    this is an - "aquired taste"

元のデータと比較すると、引用符の一部が欠落していることがわかります。 PSがこのような要素から引用符を削除するのを停止(防止)するにはどうすればよいですか? CSVをインポートし、データを操作してから、別のCSVにエクスポートして戻す必要があります。インターネットで回答を検索するたびに、引用符を削除する方法について結果が得られますが、引用符を保持する方法が見つからないようです。インポートまたはエクスポートプロセスで引用符を削除したくありません。

前もって感謝します、

STGdb

1
STGdb

ファイルが有効なCSVではありません。 (まあ、公式の標準はありませんが、事実上 1つあります。)二重引用符は、CSVで周囲のフィールドに対して特別な意味を持ちます。 「サラウンド」ではないものは、通常、次のように2倍にすることで、何らかの方法でエスケープする必要があります。

12.33   Apple   Orange  """this is"" great ""to eat"""

また、フィールド全体を二重引用符で囲む必要があります。そうしないと、パーサーが混乱します。そのため、フィールドは3つの二重引用符で開始および終了します。

ファイルの形式を変更できない場合は、タブを分割して自分で解析することができます。もちろん、これは、実際のフィールド内にタブがないことを保証できる場合にのみ機能します。タブは、フィールドセパレータとしてのみ使用する必要があります。

gc .\test.txt | 
    % { $f = $_ -split "`t"; [pscustomobject]@{price=$f[0];item1=$f[1];item2=$f[2];desc=$f[3]} }

出力:

price item1 item2  desc
----- ----- -----  ----
12.33 Apple Orange "this is" great "to eat"
10.99 Pear  Lemon  "this" is an - "aquired taste"
3
dangph