2013-03-30 4 views
0

У меня есть XML-файл, содержащий, среди прочего, цифры. Что-то вроде:Как преобразовать все числа в текстовый файл

<things> 
    <a name="cat"> 
     <vecs>(100,20),(200,40),(50,85)</vecs> 
    </a> 
    <b name="dog"> 
     <vecs>(0,10),(5,75)</vecs> 
     <ratio>85.5</ratio> 
    </b> 
    ... many more elements and numbers ... 
</things> 

К сожалению, все числа с <vecs> элементов в моем файле, в 4 раза больше, чем они должны быть. Мне нужно их умножить на 0,25. Номера в <ratio> и другие элементы в порядке. Так, например, первая линия <vecs> выше должен следующим образом:

<vecs>(25,5),(50,10),(12.5,21.25)</vecs> 

Есть удобное решение (например, UNIX утилита командной строки, Баш скрипт и т.д.) для обработки файла, так что я могу найти все номера которые живут в определенном контексте (например, между <vecs> и </vecs>), выполняют на них математическую операцию и заменяют существующий числовой текст в каждом экземпляре результатом операции?

И нет, я не прошу вас написать целую программу для решения этой конкретной проблемы в деталях. Мне интересно, существует ли существующий инструмент для таких целей или умное сочетание существующих инструментов, которые могли бы выполнить эту работу.

+1

Кажется, что быстрый скрипт Python должен выполнять эту работу. Все, что действительно, позволит вам легко читать XML из файла, изменять определенные элементы этого XML и записывать изменения обратно. –

+0

@MattBall Да, я думал, что это может заставлять меня наконец изучить Python. Или Perl или Ruby. – OldPeculier

ответ

1

Проблема сама по себе довольно проста, но синтаксис достаточно необычен, чтобы использовать язык сценария общего назначения для решения проблемы. Например, в Python можно было бы написать что-то вроде этого

from __future__ import print_function 
import re 

def transform(match): 
return '(%.2f,%.2f)' % (int(match.group(1))*0.25, 
         int(match.group(2))*0.25) 

for line in file('test.xml'): 
    if '<vecs>' in line: 
     print(re.sub(r'\((\d+),(\d+)\)',transform,line),end='') 
    else: 
     print(line,end='') 

Для особых проблем, вам лучше всего выучить язык сценариев и использовать, чтобы решить их.

Если вы хотите использовать инструменты unix, чтобы делать такие вещи, sed и awk - ваши друзья.

+0

спасибо за решение, а также за советы. Я много лет работал в C и рассматривал решение на основе C, но это действительно похоже на сценарий для сценариев. – OldPeculier

Смежные вопросы