6

文字列列を含む CSV ファイルがあり、列が複数の行にまたがっています。それらの複数行を 1 行に集約したいと考えています。

例えば

1, "asdsdsdsds", "John"
2, "dfdhifdkinf
dfjdfgkdnjgknkdjgndkng
dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"

出力を

1, "asdsdsdsds", "John"
2, "dfdhifdkinf dfjdfgkdnjgknkdjgndkng dkfdkjfnjdnf", "Roy"
3, "dfjfdkgjfgn", "Rahul"

PowerShell を使用してこの出力を実現したい

ありがとう。

4

5 に答える 5

4

Ansgarの回答に基づいて、次の場合に行う方法は次のとおりです。

  • 列名がわからない
  • CSV ファイルには、CR または LF が個別に含まれる場合があります

    (Import-Csv $csvInput) | % {
        $line = $_
        foreach ($prop in $line.PSObject.Properties) {
            $line.($prop.Name) = ($prop.Value -replace '[\r\n]',' ')
        }
        $line
    } | Export-Csv $csvOutput -NoTypeInformation
    
于 2014-03-24T00:30:56.597 に答える
0

参考: CSV クリーナーを作成しました: https://stackoverflow.com/a/32016543/361842

これは、不要な文字を置き換えるために使用できます。ニーズに合わせて簡単に調整できます。

以下にコピーされたコード。ただし、上記のスレッドを参照して、他のユーザーからのフィードバックを確認することをお勧めします。

clear-host
[Reflection.Assembly]::LoadWithPartialName("System.IO") | out-null
[Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic") | out-null

function Clean-CsvStream {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline=$true)]
        [string]$CsvRow
        ,
        [Parameter(Mandatory = $false)]
        [char]$Delimiter = ','
        ,
        [Parameter(Mandatory = $false)]
        [regex]$InvalidCharRegex 
        ,
        [Parameter(Mandatory = $false)]
        [string]$ReplacementString 

    )
    begin {
        [bool]$IsSimple = [string]::IsNullOrEmpty($InvalidCharRegex) 
        if(-not $IsSimple) {
            [System.IO.MemoryStream]$memStream = New-Object System.IO.MemoryStream
            [System.IO.StreamWriter]$writeStream = New-Object System.IO.StreamWriter($memStream)
            [Microsoft.VisualBasic.FileIO.TextFieldParser]$Parser = new-object Microsoft.VisualBasic.FileIO.TextFieldParser($memStream)
            $Parser.SetDelimiters($Delimiter)
            $Parser.HasFieldsEnclosedInQuotes = $true
            [long]$seekStart = 0
        }
    }
    process {
        if ($IsSimple) {
            $CsvRow
        } else { #if we're not replacing anything, keep it simple
            $seekStart = $memStream.Seek($seekStart, [System.IO.SeekOrigin]::Current) 
            $writeStream.WriteLine($CsvRow)
            $writeStream.Flush()
            $seekStart = $memStream.Seek($seekStart, [System.IO.SeekOrigin]::Begin) 
            write-output (($Parser.ReadFields() | %{$_ -replace $InvalidCharRegex,$ReplacementString }) -join $Delimiter)
        }
    }
    end {
        if(-not $IsSimple) {
            try {$Parser.Close(); $Parser.Dispose()} catch{} 
            try {$writeStream.Close(); $writeStream.Dispose()} catch{} 
            try {$memStream.Close(); $memStream.Dispose()} catch{} 
        }
    }
}
$csv = @(
    (new-object -TypeName PSCustomObject -Property @{A="this is regular text";B="nothing to see here";C="all should be good"}) 
    ,(new-object -TypeName PSCustomObject -Property @{A="this is regular text2";B="what the`nLine break!";C="all should be good2"}) 
    ,(new-object -TypeName PSCustomObject -Property @{A="this is regular text3";B="ooh`r`nwindows line break!";C="all should be good3"}) 
    ,(new-object -TypeName PSCustomObject -Property @{A="this is regular text4";B="I've got;a semi";C="all should be good4"}) 
    ,(new-object -TypeName PSCustomObject -Property @{A="this is regular text5";B="""You're Joking!"" said the Developer`r`n""No honestly; it's all about the secret VB library"" responded the Google search result";C="all should be good5"})
) | convertto-csv -Delimiter ';' -NoTypeInformation
$csv | Clean-CsvStream -Delimiter ';' -InvalidCharRegex "[`r`n;]" -ReplacementString ':' 
于 2015-08-14T18:32:50.690 に答える
0

Export-CSV には次の 2 つの問題があります。

  • 初期バージョン (powershell1 & 2) では、CSV にデータを追加できません
  • パイプされるデータに改行文字が含まれている場合、そのデータは Excel では役に立ちません。

上記の両方に対する解決策は、代わりに Convertto-CSV を使用することです。以下にサンプルを示します。

{bunch of stuff} | ConvertTo-CSV | %{$_ -replace "`n","<NL>"} | %{$_ -replace "`r","<CR>"} >>$AppendFile

これにより、データを編集したり (この場合は改行データを置き換えたり)、redirectors を使用して追加したりできることに注意してください。

于 2014-11-19T18:23:34.233 に答える