如何使用PowerShell修复文件的断线记录?

oo7oh9g9  于 2023-03-30  发布在  Shell
关注(0)|答案(2)|浏览(144)

在我的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"
t3psigkw

t3psigkw1#

我的直觉是做一些类似于Karthick's answer的事情,但是我首先看了一下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”被分成两行。
因此,我看到了引入对象并修改底层属性值的可能性,而不是试图修复字符串数据。我做了下面的工作:

$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

无论哪个字段有换行符,这段代码都应该有效。

2eafrhcq

2eafrhcq2#

你可以试试下面的。这对我很有效。我假设第一行是标题。

$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

相关问题