Powershell Parsing Pipeline CSV-данные с символами новой строки, используя ConvertFrom-Csv - PullRequest
0 голосов
/ 09 ноября 2018

При попытке проанализировать данные CSV с символами новой строки внутри полей ConvertFrom-Csv не будет работать должным образом. Вот пример:


test.csv

name,address
John Doe,"123 Easy Way
Apt. 10
Somewhere, USA"
Jane Doe,"456 Main St
Unit 5
SomewhereElse, USA"

Правильный разбор

> Import-Csv test.csv

name     address
----     -------
John Doe 123 Easy Way...
Jane Doe 456 Main St...

Неправильный анализ

> 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"

Как видно, новые строки анализируются как новые записи, а не как новые строки в поле. Как вы решаете эту проблему?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

это довольно хрупко в том смысле, что в нем жестко закодировано количество строк на запись. тем не менее, он работает с вашим набором данных. [ ухмылка ] я подозреваю, что тщательно написанное регулярное выражение сделает работу быстрее, но я не смог придумать такое.

# fake reading in a text file
#    in real life, use "Get-Content"
$InStuff = @'
name,address
John Doe,"123 Easy Way
Apt. 10
Somewhere, USA"
Jane Doe,"456 Main St
Unit 5
SomewhereElse, USA"
'@ -split [environment]::NewLine

$CleanedInStuff = foreach ($Index in 0..$InStuff.GetUpperBound(0))
    {
    if ($Index -eq 0)
        {
        $InStuff[$Index]
        continue
        }
    if (-not [string]::IsNullOrEmpty($InStuff[$Index]))
        {
        ($InStuff[$Index..($Index + 2)]) -join ', '

        $InStuff[$Index + 1] = ''
        $InStuff[$Index + 2] = ''
        }
    }

$FromCSV = $CleanedInStuff |
    ConvertFrom-Csv

$FromCSV |
    Export-Csv -LiteralPath "$env:TEMP\Hobadee.csv" -NoTypeInformation

'=' * 40
$CleanedInStuff
'=' * 40
$FromCSV

на экране вывода ...

========================================
name,address
John Doe,"123 Easy Way, Apt. 10, Somewhere, USA"
Jane Doe,"456 Main St, Unit 5, SomewhereElse, USA"
========================================

name     address                                
----     -------                                
John Doe 123 Easy Way, Apt. 10, Somewhere, USA  
Jane Doe 456 Main St, Unit 5, SomewhereElse, USA

Содержимое файла CSV ...

"name","address"
"John Doe","123 Easy Way, Apt. 10, Somewhere, USA"
"Jane Doe","456 Main St, Unit 5, SomewhereElse, USA"
0 голосов
/ 09 ноября 2018

При попытке проанализировать данные 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...

Хотя это работает для команды Get-Content, это не работает для произвольных команд, которые могут возвращать CSV в конвейер. Чтобы позаботиться об этих ситуациях, передайте вывод через команду «Out-String».

Правильный анализ трубопровода

Я нашел 2 варианта, которые будут работать:

PS> <command> | Out-String | ConvertFrom-Csv

Этот следующий метод благодаря sifb в #Powershell. Это немного более "хакерский", но работает просто отлично и может быть полезным.

PS> (<command>) -join "`r`n" | ConvertFrom-Csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...