记事本++;或PowerGrep regex来查找、乘以和替换价格
我有一个xml文件,需要查找、乘以(例如乘以1.25)并替换所有价格 价格标签如下所示:记事本++;或PowerGrep regex来查找、乘以和替换价格,regex,replace,notepad++,powergrep,Regex,Replace,Notepad++,Powergrep,我有一个xml文件,需要查找、乘以(例如乘以1.25)并替换所有价格 价格标签如下所示: 操作后,价格标签应如下所示: 这可以在Notepad++或PowerGrep中使用正则表达式实现吗 提前谢谢。据我所知,您不能使用任何一个程序来进行数学运算,但您可以使用您选择的大多数语言构建一个简单的程序来获取文件,使用正则表达式来查找数字。将该字符串转换为双精度,进行数学运算,然后将其放回字符串中。今天晚些时候,我可能会用c#构建一些东西,但在大多数语言中,它应该是相对简单的。如果您不在window
操作后,价格标签应如下所示:
这可以在Notepad++或PowerGrep中使用正则表达式实现吗
提前谢谢。据我所知,您不能使用任何一个程序来进行数学运算,但您可以使用您选择的大多数语言构建一个简单的程序来获取文件,使用正则表达式来查找数字。将该字符串转换为双精度,进行数学运算,然后将其放回字符串中。今天晚些时候,我可能会用c#构建一些东西,但在大多数语言中,它应该是相对简单的。如果您不在windows环境中或使用Powershell for windows,您甚至可以构建一个shell脚本并使用grep,但我对Powershell的使用经验较少 编辑:有一种更简单的方法可以做到这一点 这基本上就是使用xmldocument对象要做的事情 Edit2:虽然我找不到原始海报,但我还是这么做了。我想可能有人能利用这些信息,我学到了很多。如果有人感兴趣,我可以将源代码添加到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;
}
Notepad++有一个插件,允许您创建快速Python脚本,以访问您的文档和Notepad++本身
中介绍了安装和设置
从那时起,API有了一些改进,现在用正则表达式替换了它
#启动一系列作为一个单元撤消和重做的操作。可能是嵌套的。
editor.beginUndoAction()
#相乘\u价格\u cdata
从十进制输入*
两位=十进制(10)**-2
def倍增\u价格\u cdata(m):
价格=十进制(m.group(2))*十进制(1.25)
返回m.group(1)+str(价格量化(两位))+m.group(3)
def cdata(m):
返回“CDATA”
#npp++搜索/替换
价格=r'()'
编辑器.重新替换(重新定价,乘以价格\U cdata)
#结束撤消序列
editor.endUndoAction()
正则表达式不能与数字相乘。但你们可以编写一个小程序,使用regexp查找所有的价格,乘法并替换它。谢谢你们,为我节省了时间(这将花费在搜索上)。对于像你这样的程序员来说,这可能是一件容易的事情,但对于像我这样的“用户”来说,这是一座山。如果(且仅当)这不是什么大事,我希望看到你所说的解决方案。向大家问好。您需要检查多少个文件,乘法是多少?每次都一样吗?如果我能得到更多的信息,我一定会为你做这件事的。我不会花太长时间,我只需要在我不工作的时候处理它。它只有一个文件(xml产品目录),价格需要乘以1.05(5%的利润率)。评论有点具体,脱离了问题的主题,所以如果你想通过我的邮箱给我发邮件,应该在我的个人资料中,我有几个最后的问题,我几乎在午餐时就完成了,我将在这里或git hub上发布源代码,以便其他人以后可以受益。谢谢你们两位。既然有人启动了引擎,我相信我会找到答案的。致以最诚挚的问候(kidpx,我找不到任何电子邮件地址)当价格有小数点时,脚本工作正常,例如“15.25”,但当价格没有小数点时,脚本不会影响价格;t没有十进制值,例如“15”。是否有一种方法可以将这两种类型相乘?是的,您可以指定正则表达式与?
的可选匹配,或者添加逻辑or与管道|
。我已经更新了答案以匹配这两种类型。您也可以使用\d{2}Thanx指定两位小数;看起来还好。
# 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()