2016-08-23 9 views
1

私は、次の抽出物の行を含むCSVファイルを持っている:ソートおよびエクスポート-CSV

"EmployeeID","FirstName","LastName","Location","Department","TelephoneNo","Email"
"000001 ","abc ","def ","Loc1"," "," ","[email protected] "
"000023 ","ghi ","jkl ","Loc2"," "," ","[email protected] "
"000089 ","mno ","pqr ","Loc2"," "," ","[email protected] "

がどのように私は引用符を維持し、並べ替えやcsvファイルとして保存できますか?

私はCSVファイルに列のための二重引用符を持っていないと動作します次のPowerShellソーススクリプトを持っている:

Get-Content $Source -ReadCount 1000 | 
    ConvertFrom-Csv -Delimiter $Delimiter | 
    Sort-Object -Property $NamesOfColumns -Unique | 
    ForEach-Object { 
     # Each of the values in $ColumnValueFormat must be executed to get the property from the loop variable ($_). 
     $values = foreach ($value in $ColumnValueFormat) { 
      Invoke-Expression $value 
     } 
     # Then the values can be passed in as an argument for the format operator. 
     $ShowColsByNumber -f $values 
    } | 
    Add-Content $Destination; 

$Source$Delimiter$NamesOfColumns$ColumnValueFormatが与えられまたは動的に構築されています。非引用されたcsvファイルで

$ColumnValueFormatは含まれています

$_.EmployeeID.Trim() 
$_.FirstName.Trim() 
$_.LastName.Trim() 
$_.Location.Trim() 
$_.Department.Trim() 
$_.TelephoneNo.Trim() 
$_.Email.Trim() 

$ColumnValueFormat引用されたcsvファイルで含まれています

$_."EmployeeID".Trim() 
$_."FirstName".Trim() 
$_."LastName".Trim() 
$_."Location".Trim() 
$_."Department".Trim() 
$_."TelephoneNo".Trim() 
$_."Email".Trim() 

問題は、列のヘッダーを配置している$ColumnValueFormatをベースにしているようです二重引用符で囲みます。

  1. 二重引用符で囲まれた列見出し:(私はそれらを削除した場合、私はそれが行を処理しているとき、コマンドレットの内部は、列見出しを認識することを確認していない)

    私は2つの問題を抱えています。この問題は、行を処理しないので、二重引用符で列見出しを配置し​​ている$ColumnValueFormatに基づいているようです。 (二重引用符を削除すると、行を処理しているときに見出しが認識されません)。

  2. 私が最後に気づいたもう一つの問題は、最後の列が空白で、それがヌルだと思っている場合で、Invoke-Expression $valueが実行されます($valueは最後の列式が$_.Email.Trim()です - 引用されていないCSVファイル)。ステートメントをtry/catchブロックに配置しようとすると、無視されます。最後の列は$values配列に追加されず、再び爆弾になります。プロパティ名の周り
+0

スクリプトで達成したいことはありますか? –

+0

返信ありがとうございます。単にCSVファイルを処理するには、CSVファイルにカラムの二重引用符が含まれているかどうか、最後のカラムに空白が含まれていれば$ _。Emailを含むInvoke-Expression $値が許可されます。Trim()式を実行して、空白を含む$ values配列に余分な要素を配置できるようにします(ForEachループの完了によって割り当てられます)。 –

答えて

2

引用符は出力に引用符を書くことではない、スペースでアクセス名に構文的に使用されています。

Export-Csvコマンドレットには引用符を付けるオプションがありませんので、手動でCSVをエクスポートする必要があります。 ConvertFrom-Csvの後に空の値である$Nullの空の値を処理する必要があります。一部のフィールドだけが必要な場合は、-indexパラメータを持つSelectコマンドレットを使用します。それはメモリ内のファイル全体を保持していないため、

Get-Content $Source | 
    ConvertFrom-Csv | 
    %{ $header = $false } { 
     if (!$header) { 
      $header = $true 
      '"' + (
       ($csv[0].PSObject.Properties.Name.trim() | 
        select -index 1,6 
       ) -join '","' 
      ) + '"' 
     } 
     '"' + (
      ($_.PSObject.Properties.Value | 
       %{ if ($_) { $_.trim() } else { '' } } | 
       select -index 1,6 
      ) -join '","' 
     ) + '"' 
    } | Out-File $Destination 

上記のコードは、大きなCSVファイルのパス・スルー・プロセッシングのための素晴らしいです。それ以外の場合は、コードを少し簡略化することができます。

$csv = Get-Content $Source | ConvertFrom-Csv 
$csv | %{ 
    '"' + (
     ($csv[0].PSObject.Properties.Name.trim() | 
      select -index 1,6 
     ) -join '","' 
    ) + '"' 
} { 
    '"' + (
     ($_.PSObject.Properties.Value | 
      %{ if ($_) { $_.trim() } else { '' } } | 
      select -index 1,6 
     ) -join '","' 
    ) + '"' 
) | Out-File $Destination 
+0

返信ありがとうございます。私のコードを同様に変更してお知らせします。 :-) –

+0

もう1つあなたはどのように動的にしますか?そのため、出力ファイルに移動する列を選択することはできますか?私の元のコードでは、$ ShowColsByNumberは{2}、{4}としました。だから私は私が出力ファイルにしたい私の列を得ることができました。 –

+0

一般的な配列の選択: ''"' +(($ _。PSObject.Properties.Value.trim()| select-index1,3)-join '"、"')+ '"' ' – wOxxOm

関連する問題