Инструмент замены XML из CSV

У меня есть файлы XML, в которых я хочу заменить определенные строки.

Источником замены является файл CSV, содержащий 2 столбца.

old       |           new
-------------------------
OldPart1  |  NewPartName1
OldPart2  |  NewPartName2
OldPart3  |  NewPartName3

Я хочу заменить все вхождения на oldв newфайлах XML. Я думаю, на самом деле не имеет значения, являются ли файлы XML или просто текстовыми. Строки замены не конфликтуют с именами тегов XML.

Вы пробовали простые текстовые редакторы, такие как Notepad и Notepad++?
Да так и не нашел метод массовых замен
В Notepad++ нажмите Ctrl+H, чтобы открыть диалоговое окно поиска и замены.
Я знаю. И где мне выбрать файл CSV, чтобы заменить 1000 разных строк друг за другом?
Я неправильно вас понял, извините. Я не думаю, что есть какие-либо редакторы, которые поддерживают ваше особое требование. Я немного поэкспериментировал с PowerShell (это весело). Пожалуйста, смотрите мой ответ.

Ответы (2)

Немного магии PowerShell.

Дополнительные комментарии:

  • Ваш CSV-файл не должен содержать заголовков и должен использоваться ;в качестве разделителей.
  • Ваши входные данные и файл CSV должны быть закодированы в UTF-8 или UTF-16. Другие кодировки не могут автоматически угадываться PowerShell.
  • Сценарий не завершится, если вы укажете недопустимые имена файлов. Не ожидайте, что откроется красивое диалоговое окно с ошибкой :)
<#
  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

Используя python (доступно на/для большинства платформ и бесплатно) и предполагая, что ваш xml-файл поместится в памяти и что разделитель равен , без пробела:

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)

Я уверен, что есть лучшие/более общие способы сделать это, но на данный момент уже поздно.