Импорт CSV и замена всех специальных символов (умлаутов) - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь импортировать CSV и хочу изменить все специальные символы в CSV. например ö-> oe; ü -> уэ; и т.п. и затем экспортировать все это обратно в CSV

Содержимое CSV Пример:

101|49|201907020|DE|bla|Schütze|Yayjay|||info|info2||||||||DE||||||||
101|49|201907020|DE|bla|Götther|Yayway|||info|info2||||||||DE||||||||
101|49|201907020|DE|bla|blub|Yayway|||info|info2||||||||DE||||||||

Пробовал разными способами.

  1. с помощью команды "-replace"

    $ line = $ line -replace 'ü', 'ue'

  2. с помощью команды ".replace"

    $ line = $ line.Replace ('ö', 'oe'). Replace ('ä', 'ae')

-

$importfile = "Path to CSV.csv"
$exportfile = "Path to Export.csv"
$Content = import-csv $importfile -Encoding UTF8 -Header A

$Content | Foreach-Object { 

    foreach ($property in $_.PSObject.Properties)
    {

        [String]$line = $property.Value

        Write-host "Linie 1 $line" 
        $line = $line -replace 'ü', 'ue'

# Commented to see the different outputs
#$line1 = $line.Replace('ö','oe').Replace('ä','ae').Replace('ü','ue').Replace('ß','ss').Replace('Ö','Oe').Replace('Ü','Ue').Replace('Ä','Ae')
        Write-host "Linie 2 $line" 
    }
}
$Content 

Не заменяет специальные символы.

Если я заменим значение $ property.value на строку типа «Bla | ü |» скрипт заменяет ü на ue.

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

переиздано. Это все, что вам нужно. Добавьте больше -заменить по мере необходимости. Если хотите, set-content можно сохранить в тот же файл, но это кажется рискованным. Если входной файл не является utf8nobom, вам не нужно указывать кодировку.

(get-content file.csv) -replace 'ö','oe' -replace 'ü','ue' | set-content file2.csv
0 голосов
/ 08 июля 2019

На первый взгляд, вам не нужно использовать Import-Csv для работы с текстовым файлом. Это зависит от задачи, которую вы выполняете, но использование Get-Content в этом случае выглядит более подходящим, поскольку оно считывает файл как массив строк, а не как массив динамических объектов.

Кроме того, помните, что оператор -replace использует регулярные выражения в качестве шаблона. Вам нужно экранировать специальные символы и следовать синтаксису регулярных выражений. https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6

Мне удалось заменить эти специальные символы, используя их коды Unicode.

\ uXXXX, где XXXX - код в шестнадцатеричном формате.

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

    $importfile = 'C:\TEMP\ps_1\src.txt'
    $Content = Get-Content $importfile
    $Content | ForEach-Object {
        foreach ($ch in $_.ToCharArray())
        {
            Write-Host "$($ch)[$([int]$ch)] " -NoNewline
        } 
        Write-Host

        Write-Host $_ -ForegroundColor Green
        Write-Host ($_ -replace 'ü', 'ue') -ForegroundColor Yellow # works if script and src.txt are saved in the same encoding
        Write-Host ($_ -replace "\u0413\u0458", 'ue') -ForegroundColor White # works if src.txt is in UTF8
        Write-Host ($_ -replace "\u00FC", 'ue') -ForegroundColor Gray # works if src.txt is in UTF8 with BOM
    }

UPD:

С учетом регистра заменить. Файл src.txt имеет только одну строку:

--oöo--OÖO--uüu--UÜU--aäa--AÄA--bßb
$importfile = 'C:\TEMP\ps_1\src.txt'
$Content = Get-Content $importfile

$replacePairs = @{
    "\u00FC" = 'ue'
    "\u00DC" = 'Ue'
    "\u00F6" = 'oe'
    "\u00D6" = "Oe"
    "\u00E4" = 'ae'
    "\u00C4" = 'Ae'
    "\u00DF" = 'ss'
}

$Content | ForEach-Object {
    Write-Host $_ -ForegroundColor Green
    $resultLine = $_
    foreach($pair in $replacePairs.GetEnumerator())
    {
        Write-Host "`t$($pair.Key) $([char][Convert]::ToInt32(($pair.Key.Substring(4)), 16)) --> $($pair.Value)" -ForegroundColor Gray
        $resultLine = $resultLine -creplace $pair.Key, $pair.Value
        Write-Host $resultLine -ForegroundColor Gray
    }
    Write-Host $resultLine -ForegroundColor Yellow    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...