如何“变平”'文本文件中的行是否符合使用Python的某些条件?

时间:2013-09-25 11:00:32

标签: python api

首先,我是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- 10104,XXXXXX,AP   COMMENT,002091

     

301067,2013-09-06,2013-09-11,的 P000002 下,1133919,的 42.000 下,20,2013-10- 31103,XXXXXX,AP   COMMENT,002143

     

301067,2013-09-06,2013-09-11,的 P000002 下,1133919,的 359.400 下,20,2013-10- 31103,XXXXXX,AP   COMMENT,002143

     

301067,2013-09-06,2013-09-11,的 P000003 下,1133910,的 23.690 下,20,2013-10- 31103,XXXXXX,AP   COMMENT,002143

以上内容已经过格式化,以便于阅读,通常只是在下一行之后没有文本格式的一行。

'key'或PO字段是第一个粗体项目,第二个粗体/斜体项目是要合计的成本。因此,如果要通过脚本ID传递此示例,则期望第一行保持不变,第二行和第三行成本要添加,因为它们都来自相同的PO编号而第四行是单独留下的。

预期结果:

  

5090071648,2013-06-05,2013-09-05,的 P000001 下,1133997,的 223.010 下,20,2013-09- 10104,XXXXXX,AP   COMMENT,002091

     

301067,2013-09-06,2013-09-11,的 P000002 下,1133919,的 401.400 下,20,2013-10- 31103,XXXXXX,AP   COMMENT,002143

     

301067,2013-09-06,2013-09-11,的 P000003 下,1133910,的 23.690 下,20,2013-10- 31103,XXXXXX,AP   COMMENT,002143

如果您需要任何进一步的详细信息,我们将非常感谢您提供帮助。

提前感谢您的期待!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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])

P.S。是的,我知道Capitals是针对Classes的,但是这样可以更容易地说出我定义的变量......