Ich habe XML-Dateien, in denen ich bestimmte Zeichenfolgen ersetzen möchte.
Die Ersetzungsquelle ist eine CSV-Datei, die zwei Spalten enthält
old | new
-------------------------
OldPart1 | NewPartName1
OldPart2 | NewPartName2
OldPart3 | NewPartName3
Ich möchte alle Vorkommen von old
in new
den XML-Dateien ersetzen. Ich denke, es spielt keine Rolle, ob die Dateien XML oder nur Text sind. Die Ersetzungszeichenfolgen kollidieren nicht mit XML-Tag-Namen.
Ein wenig PowerShell-Magie.
Zusätzliche Kommentare:
;
als Trennzeichen verwendet werden.<#
Copied from: http://blogs.technet.com/b/heyscriptingguy/archive/2009/09/01/hey-scripting-guy-september-1.aspx
Many thanks to the Scripting Guy :)
Changes:
- Added a title parameter and assigned it to $OpenFileDialog.title
- Changed the function's name to Get-OpenFile
#>
Function Get-OpenFile($initialDirectory, $title)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.OpenFileDialog
$OpenFileDialog.title = $title;
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "All files (*.*)| *.*"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
} #end function Get-FileName
Function Get-SaveFile($initialDirectory, $title)
{
[System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") |
Out-Null
$OpenFileDialog = New-Object System.Windows.Forms.SaveFileDialog
$OpenFileDialog.title = $title;
$OpenFileDialog.initialDirectory = $initialDirectory
$OpenFileDialog.filter = "All files (*.*)| *.*"
$OpenFileDialog.ShowDialog() | Out-Null
$OpenFileDialog.filename
} #end function Get-OpenFile
# $PSScriptRoot is only available for PowerShell >= 3
# Fallback needed
$scriptDir = $PSScriptRoot
$inputFile = Get-OpenFile -initialDirectory $scriptDir -title "Choose your input file"
$csvFile = Get-OpenFile -initialDirectory $scriptDir -title "Choose your CSV file"
$inputStr = [Io.File]::ReadAllText($inputFile);
$csvData = Import-Csv $csvFile -Header @("Needle", "Replacement") -Delimiter ';'
$csvData | % {
$inputStr = $inputStr.Replace($_.needle, $_.replacement);
}
$outputFilename = Get-SaveFile -initialDirectory $scriptDir -title "Save your file"
$inputStr | Out-File -FilePath $outputFilename
Verwenden von python (verfügbar auf/für die meisten Plattformen und kostenlos) und unter der Annahme, dass Ihre XML-Datei in den Speicher passt und dass das Trennzeichen , ohne Leerzeichen ist:
with open(r"XML/File/Name").read() as xml:
with open(r"Path/To/Output/File", "w") as outfile:
for line in open(r"CSV/File/Name").readlines():
(orig, replacement) = ','.split(line) # Change ',' to your separator
xml.replace(orig, replacement)
outfile.writeline(line)
Ich bin mir sicher, dass es bessere/allgemeinere Möglichkeiten gibt, dies zu tun, aber im Moment ist es spät.
ComFreek
Jürgen D
ComFreek
Jürgen D
ComFreek