如果文本文件中的行满足某些条件,如何使用Python“展平”这些行?

2024-04-20 11:18:19 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我是一个全新的Python编程新手,除了web语言。在

因此,我开发了一个脚本,使用Python作为一个名为Spendmap的软件和一个名为Freeagent的在线应用程序之间的接口。这个剧本很好用。它导入并解析文本文件,并通过API将其推送到web应用程序。在

我正在挣扎的是,Spendmap为每个订单导出多行,而Freeagent希望每个订单输出一行。因此,我需要将分布在多个行中的任何订单的成本值相加,然后将这些行“展平”成一行,这样就可以通过API发送。“key”字段是“PO”字段。因此,如果脚本看到任何匹配的订单号,我希望它按照上面的方法将它们展平。在

这是Spendmap生成的文本文件的“虚拟”示例:

5090071648,2013-06-05,2013-09-05,P000001,1133997,223.010,20,2013-09-10,104,xxxxxx,AP COMMENT,002091

301067,2013-09-06,2013-09-11,P000002,1133919,42.000,20,2013-10-31,103,xxxxxx,AP COMMENT,002143

301067,2013-09-06,2013-09-11,P000002,1133919,359.400,20,2013-10-31,103,xxxxxx,AP COMMENT,002143

301067,2013-09-06,2013-09-11,P000003,1133910,23.690,20,2013-10-31,103,xxxxxx,AP COMMENT,002143

上面的格式是为了便于阅读,通常只是一行接一行,没有文本格式。在

“键”或“采购订单”字段是第一个粗体项目,第二个粗体/斜体项目是要合计的成本。因此,如果这个例子是通过脚本id传递的,那么第一行应该是单独的,第二行和第三行的成本将被添加,因为它们都来自同一个订单号,第四行则是单独的。在

预期结果:

5090071648,2013-06-05,2013-09-05,P000001,1133997,223.010,20,2013-09-10,104,xxxxxx,AP COMMENT,002091

301067,2013-09-06,2013-09-11,P000002,1133919,401.400,20,2013-10-31,103,xxxxxx,AP COMMENT,002143

301067,2013-09-06,2013-09-11,P000003,1133910,23.690,20,2013-10-31,103,xxxxxx,AP COMMENT,002143

如果您需要更多的细节,我们将不胜感激。在

感谢您的光临!在


Tags: 订单脚本apiweb应用程序commentap成本
2条回答

我不会给你答案的。但你应该:

  1. 编写并测试一个正则表达式,该表达式将行分解为多个部分,或者使用CSV库。在
  2. 把数字解析出来,使它们是十进制数而不是字符串
  3. 按ID收集行。也许您可以使用dict将ID映射到订单列表?在
  4. 当所有的输入都完成后,迭代该dict并将存储在该列表中的所有订单相加。在
  5. 生成一个字符串格式函数,以预期格式输出行。在
  6. 也许将输出反馈到输入中,以测试是否得到相同的结果。如果我理解问题的话,第二轮应该没有变化。在

祝你好运!在

我将使用字典来编译这些行,如果已经存在值,则使用get(key,0.0)来求和值,如果不存在,则从零开始:

InputData = """5090071648,2013-06-05,2013-09-05,P000001,1133997,223.010,20,2013-09-10,104,xxxxxx,AP COMMENT,002091
301067,2013-09-06,2013-09-11,P000002,1133919,42.000,20,2013-10-31,103,xxxxxx,AP COMMENT,002143
301067,2013-09-06,2013-09-11,P000002,1133919,359.400,20,2013-10-31,103,xxxxxx,AP COMMENT,002143
301067,2013-09-06,2013-09-11,P000003,1133910,23.690,20,2013-10-31,103,xxxxxx,AP COMMENT,002143"""

OutD = {}
ValueD = {}

for Line in InputData.split('\n'):
    # commas in comments won't matter because we are joining after anyway
    Fields = Line.split(',') 
    PO = Fields[3]
    Value = float(Fields[5])
    # set up the output string with a placeholder for .format()
    OutD[PO] = ",".join(Fields[:5] + ["{0:.3f}"] + Fields[6:])
    # add the value to the old value or to zero if it is not found
    ValueD[PO] = ValueD.get(PO,0.0) + Value

# the output is unsorted by default, but you could sort or preserve original order
for POKey in ValueD:
    print OutD[POKey].format(ValueD[POKey])

是的,我知道大写字母是用来表示类的,但是这样可以更容易地判断我定义了什么变量。。。在

相关问题 更多 >