В PowerShell, используя командлет export-csv, есть ли способ определить терминатор строки, в отличие от стандартного возврата каретки? - PullRequest
1 голос
/ 14 июля 2011

У меня есть поля в файлах csv, в которых есть возврат каретки, думаю, электронные письма, и я хотел бы определить другой терминатор строки, если это вообще возможно, спасибо!

Ответы [ 4 ]

2 голосов
/ 14 июля 2011

По соглашению многострочное поле в поле csv отделяется двойными кавычками ("). Powershell должен сделать это, или вы:

PS C:\> $ob = new-object PSObject |
    add-member -memberType NoteProperty -name "header" -value "header1" -PassThru |
    add-member -memberType NoteProperty -name "body" -value  @"
Body text
with carriage returns
"@ `
    -PassThru |
    add-member -memberType NoteProperty -name "tail" -value "tail1" -PassThru
PS C:\> $ob

header                                  body                                    tail
------                                  ----                                    ----
header1                                 Body text...                            tail1

PS C:\> $ob | Export-Csv \temp\ml.csv
PS C:\> get-content \temp\ml.csv
#TYPE System.Management.Automation.PSCustomObject
"header","body","tail"
"header1","Body text
with carriage returns","tail1"

Теперь импорт этого файла должен дать вам оригинал:

PS C:\> (import-csv C:\Temp\ml.csv).body
Body text
with carriage returns
1 голос
/ 12 августа 2015

Вот одно из решений:

function Remove-LineBreaks {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline=$true)]
        [psobject]$InputObject #csv row
        ,
        [Parameter()]
        [string]$Replacement = ''
    )
    process {
        $InputObject | %{$_ -replace "`n", $Replacement}
    }
}

clear-host
$example = 1..3 | %{new-object -TypeName PSObject -Property @{
    Index=$_
    Name=("I'm No {0:00}" -f $_)
    Text=@"
this is some multiline text
for item index $_
blah blah blah
"@
}}

write-host 'With Line Breaks' -ForegroundColor Green
$example | convertto-csv -NoTypeInformation 
write-host 'Without Line Breaks' -ForegroundColor Green
$example | convertto-csv -NoTypeInformation | Remove-LineBreaks -Replacement '; '

Затем можно преобразовать обратно в объект, у которого все строки параметров удалены, добавив | ConvertFrom-CSV в конце, или можно вывести в файл, добавив | set-content -Path '.\filename.csv'.

1 голос
/ 14 июля 2011

Не похоже, что есть.Глядя на код для команды с Reflector, он записывает строку, используя метод WriteLine TextWriter, который использует \ r \ n в конце ...

0 голосов
/ 16 апреля 2014

На самом деле вы можете использовать -Delimiter для классификации строк, например, я использую запятую "," для классификации строк ..

import-csv "C:\Path" -Delimiter ","
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...