是否存在任何方法/代码/引用来计算CSV文件中每行记录的列数,可能使用PowerShell Get-Content
并且不使用任何Excel API,因为CSV文件中的记录是非常大(1GB +)。使用诸如Import-Csv
或New-Object -ComObject Excel.Application
之类的Excel API将需要很长的时间来处理。
以下图片是CSV文件中的记录示例。
以下图片与Notepad ++中打开的CSV相同。如您所见,第4行只有一个分隔符。因此,此行计为2列,而其他行为4列。
我想创建一个脚本,可以用很短的时间检查每一行CSV数据,并且如果分隔符与标题不同,可以检测到列丢失(如第4行第2行但第1行所示)标题为4列)。所以最终的结果是这样的:
第2行4列通过
第3行4列通过
第4行2列失败
我目前在已完成的脚本中使用COMAPI,但我想切换到使用Get-Content
。但是,引用的逗号会导致错误的结果。
# sample testing code snippet
$path = "testing.csv"
$delimiter = ","
Get-Content $path | ForEach-Object {($_.Split($delimiter)).Count}
同一个CSV文件的结果如下:
4
4
4
3
答案 0 :(得分:2)
如果您Import-Csv
,则每个项目值($_.PSObject.Properties.Value
)都会转换为字符串,除非列中缺少整个项目,.Value
属性将设置为$Null
。
如果您的csv
文件包含标题行,则假定标题的数量至少与行中的最大列数相同:
Import-Csv .\testing.csv | ForEach {@($_.PSObject.Properties | Where {$_.Value -ne $Null}).Count}
如果您的csv
文件不包含标题行,您可以自己添加大量标题:
Import-Csv .\testing.csv -Header @(0..99) | ForEach {@($_.PSObject.Properties | Where {$_.Value -ne $Null}).Count}