2016-09-26 21 views
0

パイプで区切られたファイルをループするときに、その行に28列あり、その行をファイルにエクスポートするだけです。これは私が探している主な質問と答えです(私は多くのことを研究しましたが、私はPSには新しく、いくつかの助けが必要です)。以下の作品は2つの問題があります。エクスポートファイルでは、区切られたパイプを選択することはできません。出力は、序数ではなく、フィールド名でアルファベット順に表示されます。Powershellループcsvファイルcsv行を1つずつエクスポートする

また、出力を「テキスト」に修飾しない方法もありますか?

$path = Get-ChildItem c:\temp\*.txt 

$staticPath = '0859' 
$year = Get-Date -format yy 
$month = Get-Date -format MM 
$day = Get-Date -format dd 
$output = 'c:\temp\' + $year + $month + $day + $staticPath + '.TXT' 
$outputbad = 'c:\temp\BAD' + $year + $month + $day + $staticPath + '.TXT' 



$input = 'c:\temp\' + $path.Name 
$input 

$csv = Import-Csv -path $input -Delimiter "|" 

foreach($line in $csv) 
{ 

$properties = $line | Get-Member -MemberType Properties 
$row = '' 
$properties.Count 
$obj = new-object PSObject 

for($i=0; $i -lt $properties.Count;$i++) 
{ 

    $column = $properties[$i] 
    $columnvalue = $line | Select -ExpandProperty $column.Name 
    #$row += $columnvalue 
    $obj | add-member -membertype NoteProperty -name $column.Name -value  $columnvalue 
    } 


    if($properties.Count -eq 28) 
    { 
     $obj | export-csv -Path $output -Append -NoTypeInformation 
     #$row | Export-Csv -Path $output -Append -Delimiter "|" -NoTypeInformation 

    } 
    else 
    { 
     $obj | Export-Csv -Path $outputbad -Append -Delimiter "|" -NoTypeInformation 

    } 
} 

答えて

0

愚かな私は、ここに答えです。しかし、なぜ誰かがPSObjectやプロパティのループがアルファベット順であると答えることができれば助けになるでしょう。まもなく私はこのフィールドにアルファベットのフィールド名の順序ではなく整数をチェックするためにインテリジェンスを追加したいと思います。次に、BADレコードを修正する方法を知っています。

$path = Get-ChildItem c:\temp\*.txt 

$staticPath = '0859' 
$year = Get-Date -format yy 
$month = Get-Date -format MM 
$day = Get-Date -format dd 
$output = 'c:\temp\' + $year + $month + $day + $staticPath + '.TXT' 
$outputbad = 'c:\temp\BAD' + $year + $month + $day + $staticPath + '.TXT' 

$input = 'c:\temp\' + $path.Name 

$csv = Import-Csv -path $input -Delimiter "|" 

foreach($line in $csv) 
{ 
    $properties = $line | Get-Member -MemberType Properties 

    if($properties.Count -eq 28) 
    { 
     $line | export-csv -Path $output -Append -NoTypeInformation -Delimiter "|" 
    } 
    else 
    { 
     $line | Export-Csv -Path $outputbad -Append -Delimiter "|" 
    } 
} 
+1

'Import-Csv'がCSVテキストの行を' PSObject'インスタンスに「水和」すると、CSVのフィールドの順序は失われます。 'PSObject'インスタンス(' $ line')と 'Get-Member'コマンドレットのどちらもフィールドの元の順序を知る方法はありません。 – BACON

1

あなたはこれらの行ファイルの書式設定を変更するのいずれかのチャンスを避けたい場合は、おそらくあなたは-CSVコマンドを使用する必要はありません。輸出のCSVなどの引用符を追加することができますここであなたがやりたいかもしれない別の方法です:

$path | ForEach-Object { 
    $good = @() 
    $bad = @() 
    Get-Content $_ | ForEach-Object { 
     if (($value = $_ -split '\|').length -eq 28) { 
      $good += $_ 
     } else { 
      $bad += $_ 
     } 
    } 
    if ($good) { Out-File -Append -InputObject $good $output } 
    if ($bad) { Out-File -Append -InputObject $bad $outputbad } 
} 

注しかし、これは違った輸入csvファイルよりもパイプを含む、引用符で囲まれた値をカウントすること。パイプで区切られた値は、引用論理なしで生成されることがあります。あなたがif内でそれらを修正するためにいくつかのコードを書きたいならば、あなたはそれが当時$good += $values -join '|'とアップそれらを結合を使用、または多分修正するために別の正規表現を使用できるように

$values変数は、個々の列の配列になりますエラー。

関連する問題