不使用Excel API计数CSV列
是否有任何方法/代码/引用来计算CSV文件中的每一行logging的列数,可能使用PowerShell的Get-Content
,而不使用任何Excel API,因为CSV文件中的logging非常大(1GB +) 。 使用Excel API(如Import-Csv
或New-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}