2013-09-04 3 views
3

У меня есть файл CSV со строковым столбцом: этот столбец охватывает несколько строк. Я хочу объединить эти несколько строк в одну строку.Удалите символ новой строки из столбца строки CSV файла

Например

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

Я хочу, чтобы мой выход будет

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

Я хочу, чтобы достичь этого результата с помощью PowerShell

Спасибо.

+0

Пропущенная двойная кавычка в конце строки 2 колонка 2 намеренная или это опечатка? Пусть строки содержат запятые? –

+0

typo ... Извините за это. Исправлено это! –

+0

Как это можно сделать в PHP? –

ответ

3

Попробуйте это:

$csv = 'C:\path\to\your.csv' 

(Import-Csv $csv -Header 'ID','Value','Name') | % { 
    $_.Value = $_.Value -replace "`r`n",' ' 
    $_ 
} | Export-Csv $csv -NoTypeInformation 

Если CSV содержит заголовки, удалить -Header 'ID','Value','Name' от импорта и заменить Value с действительным именем столбца.

Если вы не хотите, двойные кавычки вокруг полей, вы можете удалить их, заменив Export-Csv с чем-то вроде этого:

... | ConvertTo-Csv -NoTypeInformation | % { $_ -replace '"' } | Out-File $csv 

Чтобы удалить заголовок из вывода вы добавить еще один фильтр перед Out-File пропустить первая строка:

... | select -Skip 1 | Out-File $csv 
+0

В дополнение к вышеуказанному вопросу, у меня есть двойные кавычки в каждом столбце. В том же скрипте, как заменить двойные кавычки пустым символом? –

+0

Спасибо Ansgar !! Один маленький вопрос, есть ли способ удалить заголовок с выхода CSV? –

+0

Когда я пытаюсь открыть недавно созданный файл csv в excel, он открывается только в одном столбце. Как это можно решить? –

1

Вы можете импортировать csv, выполнить специализированный выбор и записать результат в новый CSV.

import-csv Before.csv -Header "ID","Change" | Select ID,@{Name="NoNewLines", Expression={$_.Change -replace "`n"," "}} | export-csv After.csv 

Ключевая часть находится в операторе отбора, который позволяет пройти специальную хэш-таблицу (Name это имя свойства, выражение является ScriptBlock, который вычисляет его).

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

2

Опираясь на ответ 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 
    
0

Проблемы с Экспортно-CSV двояки:

  • Ранние версии (powershell1 & 2) не позволяют добавлять данные в CSV
  • Если данные, передаваемые на него, содержат n ewline, данные бесполезны в Excel

Решение для обоих вышеперечисленных способов заключается в использовании Convertto-CSV. Вот пример:

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

Обратите внимание, что это позволяет делать все, что редактирование на данных (в данном случае, замена новой строки данных), а также с помощью redirecrors для добавления.

0

FYI: Я создал 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 ':' 
Смежные вопросы