2016-05-30 24 views
1

PowerShellを初めて使用していて、CSVファイルをループして各行の列数を返そうとしています。その列数を最初の行と比較し、何かがそれと等しくないようにします。この場合、カンマは何も置き換えないでください。変更を加えて新しいファイルを作成します。あなたの意図が無効であるCSVファイルのどの行をチェックしている場合CSVファイルをループして各行の列数を確認する

$csvColumnCount = (import-csv "a CSV file" | get-member -type NoteProperty).count 

$CurrentFile = Get-Content "a CSV file" | 
ForEach-Object { $CurrentLineCount = import-csv "a CSV file" | get-member -type NoteProperty).count 
    $Line = $_ 
    if ($csvColumnCount -ne $CurrentLineCount) 
     { $Line -Replace "," , "" } 
    else 
     { $Line } ; 
    $CurrentLineCount++} | 
Set-Content ($CurrentFile+".out") 
Copy-Item ($CurrentFile+".out") $ReplaceCSVFile 
+0

何が問題なのですか? – DeanOC

+0

私はそれが正しく各列の列の数を数えないと思う。私が使用しているテストCSVファイルには、ヘッダー行の列よりも少ない数の行があります。このスクリプトは、ファイル全体のカンマを削除しています。 – leo

+0

行のプロパティが空であるか不足しているかどうかをテストしますか?これらの行を変更しますか? – xXhRQ8sD2L7Z

答えて

1

はその後、単純な分割を使用してカウントし、そのような何か:CSVチェックする目的のために

$csv = Get-Content 'your_file.csv' 
$count = ($csv[0] -split ',').count 
$csv | Select -Skip 1 | % { 
    if(($_ -split ',').count -eq $count) { 
    ...do valid stuff 
    } else { 
    ...do invalid stuff 
    } 
} 

は、これらのため、CSVコマンドレットを避けます例えば、問題を試してみて、正しい傾向を持つことになります。

$x = @" 
a,b,c 
1,2,3,4 
"@ 

$x | ConvertFrom-Csv 

> a b c 
    - - - 
    1 2 3 

また、私はあなたのコードの流れは少し混乱していると思います。パイプラインの結果を$ CurrentFileという変数に返そうとしていますが、パイプラインのもう一方の端では、Set-Contentのファイル名と同じ変数を使用しています。

あなたのCSVにカンマを含むことができるフィールドが引用されている場合、単純な分割は機能しません。そのような場合は、正規表現を使用して各行を列に分割し、列を数えることをお勧めします。このようなもの:

$re = '(?:^|,)(?:\"(?:[^\"]+|\"\")*\"|[^,]*)' 
$csv = Get-Content 'your_file.csv' 
$count = [regex]::matches($csv[0], $re).groups.count 
$csv | Select -Skip 1 | % { 
    if([regex]::matches($_, $re).groups.count -eq $count) { 
    ...do valid stuff 
    } else { 
    ...do invalid stuff 
    } 
} 
+0

'$ csv [1 ..($ csv.count - 1)]' .... 'の代わりに$ csv |選択 - スキップ1 | % 'ははるかに簡単に見える – Matt

+0

@Dave Sextonは返信してくれてありがとう!しかし、CSVファイルでコンマを数えることはできないので、上記のコードは機能しません。セルにコンマがある場合、CSVファイルはセルを引用符で囲みます。 import-csvは最初の行の正しいカウントを返すようですが、問題は各行を通してループしているようです。 – leo

+0

引用符で囲まれたカンマに対処するために私の答えを修正してください。 –

関連する問題