【问题标题】:Count CSV columns without using Excel API在不使用 Excel API 的情况下计算 CSV 列
【发布时间】:2018-05-19 23:18:52
【问题描述】:

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

下图是 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
3

【问题讨论】:

  • CSV 不是 excel 文件。 CSV 是一个文本文件。所以只需使用文本函数来做你需要做的事情(计算每一行的分隔符)
  • Stack Overflow 是一个社区而不是一个代码编写服务,希望您尝试自己编写代码。我建议您对您的问题进行一些研究(也许尝试页面顶部的搜索框)并尝试自己编写一些代码。我会帮助你指向Get-ContentImport-Csv,这些是可能的解决方案的基础
  • @JamesC。当然,我做了一些研究,这就是为什么我用示例数据发布这个问题并询问是否有任何替代解决方案。我确实尝试过使用 ComAPI 运行,执行 1000 行数据大约需要 2 分钟。我确实提到了使用 get-content 等方法,但是 get-content 会面临分隔符 (,) 可能是数据的一部分的问题,如上图所示。因此,我将寻求有关解决此问题的替代方法的意见。无论如何感谢您的建议。
  • @Nick.McDermaid 但是,如果使用诸如 get-content 之类的文本函数会出现引用分隔符问题,那么第 4 行将显示为 3 列,因为如果我没记错的话有 2 个逗号
  • 如果您已对该问题进行过研究,请添加您的代码,以便我们知道您尝试了什么。

标签: excel powershell csv


【解决方案1】:

如果您Import-Csv,则每个项目 ($_.PSObject.Properties.Value) 都会转换为字符串,除非列中缺少整个项目,否则.Value 属性将设置为@ 987654326@.

如果您的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}

【讨论】:

  • 您好,感谢您的回复,我尝试了您的方法,但如果我将另一行数据添加到具有 5 列的同一个 csv 文件中,结果将是 4、4、2、4。最后一个值将保持为 4 而不是 5。有什么办法解决这个问题吗?
  • 是的,在Import-Csv 中添加一个标题。例如。 -Header @(0..99)。我在答案中改变了这一点。请注意,如果您使用-Header 参数,csv 文件中的第一行将被视为数据(这意味着这些属性被计算并添加到列表顶部)。
猜你喜欢
  • 2016-06-26
  • 2015-05-25
  • 1970-01-01
  • 2020-03-27
  • 2014-10-06
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多