0

首先,我是 Python 的一个全新的人,并且会编程除 Web 语言之外的任何东西。

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

我正在努力解决的是 Spendmap 每个订单导出多行,而 Freeagent 想要每个订单一行。因此,我需要从分布在多行的任何订单中添加成本值,然后将这些行“扁平化”为 One,以便可以通过 API 发送。“key”字段是“PO”字段。因此,如果脚本看到任何匹配的 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

对此的任何帮助将不胜感激,如果您需要任何进一步的细节,请说。

提前感谢您的关注!

4

2 回答 2

2

我不会给你解决方案。但你应该:

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

祝你好运!

于 2013-09-25T11:05:12.440 回答
0

我会使用字典来编译这些行,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])

PS 是的,我知道大写字母是用于类的,但这可以更容易地分辨出我定义了哪些变量......

于 2013-09-25T18:00:17.927 回答