Как исправить записи ломаных строк файла с помощью PowerShell? - PullRequest
0 голосов
/ 21 июня 2020

В моем CSV-файле я получаю данные в неправильном формате для нескольких строк, иногда строка разбивается на две строки, как показано в таблице ниже. Для EmpId 2 строка разбита на две строки. Как найти такие записи и объединить их в одну строку в правильном формате, чтобы устранить проблему с такими записями с помощью PowerShell. Ожидаемый результат показан в таблице ниже.

Данные входного файла:

EmpId,EmpName,EmpLocation
1,"Jack","Austin"
2,"Pet
er","NYC"
3,"Raj","Delhi"

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

EmpId,EmpName,EmpLocation
1,"Jack","Austin"
2,"Peter","NYC"
3,"Raj","Delhi"

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Моим инстинктом было сделать что-то похожее на ответ Картика , однако сначала я взглянул на результат Import-Csv. Удивительно, но он помещает разрыв строки в отдельное свойство, где он был найден, например:

Import-Csv C:\temp\Broken.csv | fl 

EmpId       : 1
EmpName     : Jack
EmpLocation : Austin

EmpId       : 2
EmpName     : Pet
              er
EmpLocation : NYC

EmpId       : 3
EmpName     : Raj
EmpLocation : Delhi

Обратите внимание, что «peter» разбивается на две строки.

Итак, я увидел некоторый потенциал для переноса объектов in и измените значения базовых свойств вместо того, чтобы пытаться исправить строковые данные. Я приготовил следующее:

$CSVData = Import-Csv C:\temp\Broken.csv  

$CSVData | 
ForEach-Object{
    ForEach( $Property in $_.PSObject.Properties.Name )
    {
        $_.($Property) = $_.($Property) -replace "(`r|`n)"
    }
}

$CSVData

# If you want to re-export:
$CSVData | Export-Csv -Path c:\temp\Fixed.csv -NoTypeInformation

Этот код должен работать независимо от того, в каком поле есть разрыв строки. Попробуйте и дайте мне знать. Спасибо!

1 голос
/ 21 июня 2020

Вы можете попробовать следующее. Это сработало для меня. Я предположил, что первая строка - это заголовок.

$filepath = "D:\file.csv"
[string[]]$data = Get-Content $filepath

$data_Final = New-Object System.Collections.ArrayList

for($i = $j = 0; $i -lt $data.Count; $(if($i -eq $j){$i++}else{$i=$j+1}), ($j=$i)) { 
    
    While ( ($data[$i] -split ",").Count -ne 3 ) {
        $j = $j+1
        # Concatenate the target line ($i) with successive line(s) ($j) until the elements Count to 3
        $data[$i] = $data[$i] + $data[$j]
    }

    $data_Final.Add($data[$i]) | Out-Null
    
}

$inputData = $data_Final | ConvertFrom-Csv
# Or, if you want to fix the csv uncomment the below
# $data_Final | ConvertFrom-Csv | Export-Csv $filepath -NoTypeInformation
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...