我是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
答案 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