不使用Excel API计算CSV列

时间:2017-12-06 06:29:24

标签: excel powershell csv

是否存在任何方法/代码/引用来计算CSV文件中每行记录的列数,可能使用PowerShell Get-Content并且不使用任何Excel API,因为CSV文件中的记录是非常大(1GB +)。使用诸如Import-CsvNew-Object -ComObject Excel.Application之类的Excel API将需要很长的时间来处理。

以下图片是CSV文件中的记录示例。

enter image description here

以下图片与Notepad ++中打开的CSV相同。如您所见,第4行只有一个分隔符。因此,此行计为2列,而其他行为4列。

enter image description here

我想创建一个脚本,可以用很短的时间检查每一行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

1 个答案:

答案 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}