不使用Excel API对CSV列进行计数
是否有任何方法/代码/参考来计算CSV文件中每行记录的列数,方法是使用PowerShell不使用Excel API对CSV列进行计数,excel,powershell,csv,Excel,Powershell,Csv,是否有任何方法/代码/参考来计算CSV文件中每行记录的列数,方法是使用PowerShellGet Content,而不使用任何Excel API,因为CSV文件中的记录非常大(1GB+)。使用Excel API,如导入Csv或新建对象-ComObject Excel。应用程序将需要非常长的时间来处理 下图是CSV文件中记录的示例 下图与在Notepad++中打开的CSV相同。如您所见,第4行中只有一个分隔符。因此,该行计为2列,而其他行计为4列 我想创建一个脚本,它可以在短时间内检查CSV数
Get Content
,而不使用任何Excel API,因为CSV文件中的记录非常大(1GB+)。使用Excel API,如导入Csv
或新建对象-ComObject Excel。应用程序
将需要非常长的时间来处理
下图是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文件的结果如下:
44
4
三, 如果您选择,则每个项目值(
$\upObject.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}
CSV不是excel文件。CSV是一个文本文件。因此,只需使用文本函数来完成您需要做的事情(在每行上计算分隔符)堆栈溢出是一个社区,而不是一个代码编写服务,您可以尝试自己编写代码。我建议您对您的问题进行一些研究(可能尝试页面顶部的搜索框),并尝试自己编写一些代码。我会帮你指出你的方向,这些都是可能的基础solutions@JamesC. 当然,我做了一些研究,这就是为什么我用样本数据发布这个问题,并询问是否有其他解决方案。我确实尝试过使用ComAPI运行,执行1000行数据大约需要2分钟。我确实提到了使用诸如get content之类的方法,但是get content将面临分隔符(,)可能是数据的一部分的问题,如上图所示。因此,我会就解决这个问题的其他方法征求意见。无论如何,谢谢您的建议。@Nick.McDermaid但是如果使用文本函数(如get content)会引用分隔符问题,那么第4行将显示为3列,因为有2个逗号如果我没有弄错的话。如果您已经对该问题进行了研究,请添加您的代码,以便我们知道您尝试了什么。您好,感谢您的回复,我尝试了您的方法,正在工作,但如果我将另一行数据添加到具有5列的同一csv文件中,结果将是4,4,2,4。最后一个值将保留为4,而不是5。有没有办法解决这个问题?是的,在标题中添加一个标题。例如,
-Header@(0..99)
。我在回答中改变了这一点。请注意,如果使用-Header
参数,则csv
文件中的第一行将被视为数据(这意味着这些属性将被计数并添加到列表顶部)。