不使用Excel API计数CSV列

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

以下图像是CSV文件中logging的示例。

在这里输入图像说明

下面的图像是在Notepad ++中打开的同一个CSV文件。 正如你所看到的,第4行中只有一个分隔符。因此,这一行计为2列,而其他列为4列。

在这里输入图像说明

我想创build一个脚本,可以检查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

如果您Import-Csv ,每个项目$_.PSObject.Properties.Value )被转换为一个string,除非整个项目从列中丢失, .Value属性将被设置为$Null

如果您的csv文件包含一个标题行,则假定标题的数量至less与一行中的最大列数相同:

 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}