Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
不使用Excel API对CSV列进行计数_Excel_Powershell_Csv - Fatal编程技术网

不使用Excel API对CSV列进行计数

不使用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数

是否有任何方法/代码/参考来计算CSV文件中每行记录的列数,方法是使用PowerShell
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文件的结果如下:

4
4
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
文件中的第一行将被视为数据(这意味着这些属性将被计数并添加到列表顶部)。