2014-09-10 133 views
0

我有一个xml文件,我需要找到,乘以(例如1.25)并替换所有价格。Notepad ++或PowerGrep正则表达式来查找,乘以和替换价格

价格标签看起来像这样: <price><![CDATA[15.9]]></price>

的价格标签看起来应该在手术后: <price><![CDATA[19.875]]></price>

这可以在记事本中使用正则表达式PowerGrep做++或?

在此先感谢。

+1

正则表达式不能乘以数字。但是你可以编写一个小程序,它使用正则表达式来查找所有价格,并将其替换并替换。 – trailmax 2014-09-10 13:08:40

回答

0

据我所知,你不能使用任何一个程序来进行数学预处理,但你可以用你选择的大多数任何语言来构建一个简单的程序来使用正则表达式来查找数字。将该字符串转换为双精度数字并将其放回到字符串中。今天晚些时候,我可能会用c#构建一些东西,但在大多数语言中它应该是相对直接的。如果您不在Windows环境中,或者使用Powershell for Windows,您甚至可以构建shell脚本并使用grep,但我对Powershell的经验不足。

编辑:有一个更简单的方法来做到这一点http://msdn.microsoft.com/en-us/library/hcebdtae(v=vs.110).aspx 这实际上是你想要做的使用xmldocument对象。

编辑2:即使我无法抓住原始海报,我也这样做了我以为有人可能会使用这些信息,我学到了很多东西。如果有人感兴趣,我可以将源代码添加到github。

public static void ChangePricesWork(string filepath, double multiply) 
{ 
    var document = new XmlDocument(); 
    document.Load(filepath); 
    XmlNodeList nodeList = document.GetElementsByTagName("price"); 

    foreach (XmlNode node in nodeList) 
    { 
     if (!string.IsNullOrEmpty(node.InnerText)) 
     { 
     node.InnerText = Convert.ToString(multiplyPrice(multiply, node.InnerText)); 
     } 

    } 

    string newFilePath = string.Format(@"{0}\{1}_updated.xml", Path.GetDirectoryName(filepath), Path.GetFileNameWithoutExtension(filepath)); 
    document.Save(newFilePath); 
} 

    private static double multiplyPrice(double multiply, string oldPrice) 
    { 
    var newPrice = new double(); 
    if (Double.TryParse(oldPrice, out newPrice)) 
    { 
     newPrice = newPrice * multiply; 
    } 
    return newPrice; 
    } 
+0

谢谢你,为了节省我的时间(这将花费在搜索)。对于像你这样的程序员来说,这可能是一件容易的事情,但对于像我这样的“用户”来说,这是一座山。如果(并且只有)它不是什么大事,我希望看到你说的解决方案。最好的问候。 – Sophocles 2014-09-11 04:55:22

+0

你需要检查多少个文件,乘以多少?每次都一样吗?如果我得到更多信息,我一定会为你做这件事,这不应该让我花太多时间,当我不工作时我只需要照顾它。 – thekidxp 2014-09-11 13:10:04

+0

它只有一个文件(xml产品目录),价格需要乘以1.05(5%的保证金)。 – Sophocles 2014-09-11 14:40:18

0

记事本++有一个Pythonscript插件,允许您创建访问您的文件,记事本++本身快速的Python脚本。

安装和设置在this answer中描述。

从那时起,API已经稍微移动了一下,现在您可以用Editor.rereplace替换正则表达式。

# Start a sequence of actions that is undone and redone as a unit. May be nested. 
editor.beginUndoAction() 

# multiply_price_cdata 
from decimal import * 
TWOPLACES = Decimal(10) ** -2 

def multiply_price_cdata(m): 
    price = Decimal(m.group(2)) * Decimal(1.25) 
    return m.group(1) + str(price.quantize(TWOPLACES)) + m.group(3) 

def cdata(m): 
    return "CDATA" 

# npp++ search/replace 
re_price = r'(<price><!\[CDATA\[)(\d+\.\d+|\d+)(\]\]></price>)' 
editor.rereplace(re_price , multiply_price_cdata) 

# end the undo sequence 
editor.endUndoAction() 
+0

当价格具有十进制值时,该脚本正常工作,例如“15.25”,但它不会影响价格,例如没有小数值,例如“15”。有两种方法可以增加这两种类型吗? – Sophocles 2015-01-03 08:21:29

+0

是的,你可以用'?'指定正则表达式的可选匹配,或者用管道'|'添加逻辑或。我更新了答案以匹配这两种类型。您也可以使用\ d {2} – Matt 2015-01-03 14:31:42

+0

Thanx指定两位小数;它似乎很好。 – Sophocles 2015-01-04 10:06:55