XML-Ersetzungstool von CSV

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 oldin newden 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.

Haben Sie einfache Texteditoren wie Notepad und Notepad++ ausprobiert?
Ja, es wurde keine Methode zum Massenaustausch gefunden
Drücken Sie in Notepad++ Strg+H, um den Dialog Suchen & Ersetzen zu öffnen.
Ich weiss. Und wo wähle ich die CSV-Datei aus, um 1000 verschiedene Zeichenfolgen nacheinander zu ersetzen?
Ich habe dich falsch verstanden, sorry. Ich glaube nicht, dass es Editoren gibt, die Ihre speziellen Anforderungen unterstützen. Ich habe ein wenig mit PowerShell experimentiert (es macht Spaß). Siehe bitte meine Antwort.

Antworten (2)

Ein wenig PowerShell-Magie.

Zusätzliche Kommentare:

  • Ihre CSV-Datei darf keine Kopfzeilen enthalten und muss ;als Trennzeichen verwendet werden.
  • Ihre Eingabe- und CSV-Datei müssen beide in UTF-8 oder UTF-16 codiert sein. Andere Codierungen können von PowerShell nicht automatisch erraten werden.
  • Das Skript wird nicht beendet, wenn Sie ungültige Dateinamen angeben. Erwarten Sie nicht, dass sich ein netter Fehlerdialog öffnet :)
<#
  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.