как мне вывести многострочный файл CSV в одну строку - PullRequest
0 голосов
/ 15 января 2019

У меня есть требование проанализировать CSV, в котором есть последний многострочный столбец, и преобразовать его в CSV с одной подкладкой.

Пример:

Name,Department,Team,Task
"Jack","QA","AF","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail","He need to work
He needs to update
He needs to plan"

Ожидаемый результат:

Name,Department,Team,Task
"Jack","QA","AF","He need to work.He needs to update.He needs to plan."
"Sam","Dev","Retail","He need to work.He needs to update.He needs to plan"

Мне нужно использовать PowerShell для этого.

1 Ответ

0 голосов
/ 15 января 2019

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

# I have faked the input using a here-string, but in real life, you should use
# $csv = Import-Csv -Path <PATH TO THE CSV FILE>

$csv = @"
Name,Department,Team,Task
"Jack","QA","AF","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail","He need to work
He needs to update
He needs to plan"
"@ | ConvertFrom-Csv

# convert all newlines to a full-stop dot and replace multiple spaces in the Task field to become a single space character
$csv | ForEach-Object {
    $_.Task = $_.Task -replace '[\r?\n]+', '. ' -replace '\s{2,}', ' '
    # if you just want to 'normalize' whitespaces like a browser does, use this instead.
    # $_.Task = $_.Task -replace '\s+', ' '
}

Теперь переменная $csv содержит эти данные:

Name Department Team   Task                                                 
---- ---------- ----   ----                                                 
Jack QA         AF     He need to work. He needs to update. He needs to plan
Sam  Dev        Retail He need to work. He needs to update. He needs to plan

Затем запишите обновленный файл CSV, используя точки с запятой в качестве разделителя

$csv | Export-Csv -Path '<PATH TO THE EXPORTED CSV FILE>' -NoTypeInformation -Delimiter ';'

Надеюсь, это поможет


EDIT

Что касается вашего комментария, я понимаю, что в других столбцах могут быть новые строки. Это обновленный скрипт, который преобразует любое поле в файле в одну строку, если он содержит символы новой строки.

# Again, I have faked the input using a here-string, but in real life, you should use
# $csv = Import-Csv -Path <PATH TO THE CSV FILE>

$csv = @"
Name,Department,Team,Task
"Jack","QA","AF
XYZ","He need to work
He needs to update
He needs to plan"
"Sam","Dev","Retail
Sales","He need to work
He needs to update
He needs to plan"
"@ | ConvertFrom-Csv

# get an array of the header names
$headers = $csv[0].PSObject.Properties.name

$csv | ForEach-Object {
    foreach ($hdr in $headers) {
        # this regex converts all newlines to a full-stop dot and replaces multiple spaces to become one single space character
        $_.$hdr = $_.$hdr -replace '[\r?\n]+', '. ' -replace '\s{2,}', ' '
        # if you just want to 'normalize' all whitespaces like a browser does, use this instead.
        # $_.$hdr = $_.$hdr -replace '\s+', ' '
    }
}

После этого переменная $csv содержит эти данные:

Name Department Team          Task                                                 
---- ---------- ----          ----                                                 
Jack QA         AF. XYZ       He need to work. He needs to update. He needs to plan
Sam  Dev        Retail. Sales He need to work. He needs to update. He needs to plan

Экспорт в новый файл CSV как обычно:

$csv | Export-Csv -Path '<PATH TO THE EXPORTED CSV FILE>' -NoTypeInformation -Delimiter ';'
...