我正在尝试导入CSV,并且想要更改CSV中的所有特殊字符。 例如ö-> oe; ü-> ue;等等 然后将所有这些导出回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||||||||
尝试了不同的方式。
使用“ -replace”命令
$ line = $ line-替换'ü','ue'
使用“ .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。
答案 0 :(得分:0)
乍看之下,您不必使用Import-Csv
来处理文本文件。这取决于您正在执行的任务,但是在这种情况下使用Get-Content
看起来更合适,因为它会将文件读取为字符串数组而不是动态对象数组。
还请记住,-replace
运算符使用正则表达式作为模式。
您需要转义特殊符号并遵循regexp语法。
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_comparison_operators?view=powershell-6
我能够使用其unicode码替换这些特殊符号。
\ uXXXX,其中XXXX-十六进制代码。
$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
}
答案 1 :(得分:0)
已编辑。这就是您所需要的。根据需要添加更多-replace。如果需要,设置内容可以保存到同一文件,但这似乎很冒险。除非输入文件是utf8nobom,否则无需指定编码。
(get-content file.csv) -replace 'ö','oe' -replace 'ü','ue' | set-content file2.csv