У меня есть файлы XML, в которых я хочу заменить определенные строки.
Источником замены является файл CSV, содержащий 2 столбца.
old | new
-------------------------
OldPart1 | NewPartName1
OldPart2 | NewPartName2
OldPart3 | NewPartName3
Я хочу заменить все вхождения на old
в new
файлах XML. Я думаю, на самом деле не имеет значения, являются ли файлы XML или просто текстовыми. Строки замены не конфликтуют с именами тегов XML.
Немного магии 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)
Я уверен, что есть лучшие/более общие способы сделать это, но на данный момент уже поздно.
Комфрик
Юрген Д
Комфрик
Юрген Д
Комфрик