【发布时间】:2018-05-19 23:18:52
【问题描述】:
是否有任何方法/代码/参考来计算 CSV 文件中每行记录的列数,可能使用 PowerShell Get-Content 并且不使用任何 Excel API,因为 CSV 文件中的记录非常大(1GB+)。使用诸如Import-Csv 或New-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-Content 和Import-Csv,这些是可能的解决方案的基础
-
@JamesC。当然,我做了一些研究,这就是为什么我用示例数据发布这个问题并询问是否有任何替代解决方案。我确实尝试过使用 ComAPI 运行,执行 1000 行数据大约需要 2 分钟。我确实提到了使用 get-content 等方法,但是 get-content 会面临分隔符 (,) 可能是数据的一部分的问题,如上图所示。因此,我将寻求有关解决此问题的替代方法的意见。无论如何感谢您的建议。
-
@Nick.McDermaid 但是,如果使用诸如 get-content 之类的文本函数会出现引用分隔符问题,那么第 4 行将显示为 3 列,因为如果我没记错的话有 2 个逗号
-
如果您已对该问题进行过研究,请添加您的代码,以便我们知道您尝试了什么。
标签: excel powershell csv