Powershell 使用 ConvertFrom-Csv 解析带有换行符的管道 CSV 数据

Hob*_*dee 5 csv powershell

当尝试解析字段内带有换行符的 CSV 数据时,ConvertFrom-Csv 将无法正常工作。这是一个例子:


测试.csv

name,address
John Doe,"123 Easy Way
Apt. 10
Somewhere, USA"
Jane Doe,"456 Main St
Unit 5
SomewhereElse, USA"
Run Code Online (Sandbox Code Playgroud)

正确解析

> Import-Csv test.csv

name     address
----     -------
John Doe 123 Easy Way...
Jane Doe 456 Main St...
Run Code Online (Sandbox Code Playgroud)

解析不当

> Get-Content test.csv | ConvertFrom-Csv

name          address
----          -------
John Doe      123 Easy Way
Apt. 10
Somewhere     USA"
Jane Doe      456 Main St
Unit 5
SomewhereElse USA"
Run Code Online (Sandbox Code Playgroud)

如此处所示,换行符被解析为新记录而不是字段内的换行符。你怎么解决这个问题?

Hob*_*dee 5

当尝试解析字段内带有换行符的 CSV 数据时,使用 ConvertFrom-Csv 方法会出现问题。这是因为换行符被用作分隔符而不是传递给 ConvertFromCsv 方法。根据您获取 CSV 的方式,解决此问题的方法也有所不同:

-Raw使用开关正确解析

PS> Get-Content -raw test.csv | ConvertFrom-Csv

name     address
----     -------
John Doe 123 Easy Way...
Jane Doe 456 Main St...
Run Code Online (Sandbox Code Playgroud)

虽然这适用于 Get-Content 命令,但不适用于可能将 CSV 返回到管道的任意命令。要处理这些情况,请通过“Out-String”命令通过管道输出。

正确的管道解析

我发现有两种可行的变体:

PS> <command> | Out-String | ConvertFrom-Csv
Run Code Online (Sandbox Code Playgroud)

下面的方法要感谢 #Powershell 中的 sifb。它有点“hacky”,但工作得很好并且可以有它的用途。

PS> (<command>) -join "`r`n" | ConvertFrom-Csv
Run Code Online (Sandbox Code Playgroud)