循环访问CSV文件并验证每行的列数

时间:2016-05-30 23:28:21

标签: csv powershell

我是PowerShell的新手,并且一直试图遍历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

1 个答案:

答案 0 :(得分:1)

如果您打算检查CSV文件的哪些行无效,那么只需使用简单的拆分和计数,如下所示:

 lRow = copySheet.Cells(copySheet.Rows.Count, 1).End(xlUp).Row

 With copySheet.Range("BX2:BX" & lRow)
pasteSheet.Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(.Rows.Count, .Columns.Count) = .Value
 End With

 'Determine last row of Column B in copySheet
 lRow = copySheet.Cells(copySheet.Rows.Count, 1).End(xlUp).Row

 With copySheet.Range("CC2:CC" & lRow)
pasteSheet.Cells(Rows.Count, "B").End(xlUp).Offset(1, 0).Resize(.Rows.Count, .Columns.Count) = .Value
 End With

出于CSV检查目的,请避免使用CSV cmdlet,因为这些cmdlet会尝试更正问题,例如:

$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
  }
} 

另外我认为您的代码流程有点混乱。您尝试将管道的结果返回到名为$ CurrentFile的变量,而在该管道的另一端,您尝试使用相同的变量作为Set-Content的文件名。

如果您的CSV引用了可能包含逗号的字段,那么简单拆分将无效。如果是这种情况,更好的选择是使用正则表达式将每一行分成可以计算的列。像这样:

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

$x | ConvertFrom-Csv

>  a b c
   - - -
   1 2 3