如何';展平';文本文件中的行是否符合使用Python的特定条件?

如何';展平';文本文件中的行是否符合使用Python的特定条件?,python,api,Python,Api,首先,我是Python和编程的新手,除了web语言 因此,我开发了一个脚本,使用Python作为一个名为Spendmap的软件和一个名为Freeagent的在线应用程序之间的接口。这个脚本非常好用。它导入和解析文本文件,并通过API将其推送到web应用程序 我正在努力解决的是Spendmap每个订单导出多行,而作为Freeagent,每个订单需要一行。因此,我需要添加跨多行的任何订单的成本值,然后将这些行“展平”为一行,以便可以通过API发送。“关键”字段是“采购订单”字段。因此,如果脚本看到任

首先,我是Python和编程的新手,除了web语言

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

我正在努力解决的是Spendmap每个订单导出多行,而作为Freeagent,每个订单需要一行。因此,我需要添加跨多行的任何订单的成本值,然后将这些行“展平”为一行,以便可以通过API发送。“关键”字段是“采购订单”字段。因此,如果脚本看到任何匹配的订单号,我希望它按照上面的方法将它们展平

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

50900716482013-06-052013-09-05,P000001,1133997,223.010,202013-09-10104,xxxxxx,美联社 评论,002091

3010672013-09-062013-09-11,P000002,1133919,42.000,202013-10-31103,xxxxxx,美联社 评论,002143

3010672013-09-062013-09-11,P000002,1133919,359.400,202013-10-31103,xxxxxx,美联社 评论,002143

3010672013-09-062013-09-11,P000003,1133910,23.690,202013-10-31103,xxxxxx,美联社 评论,002143


为了便于阅读,上面的内容已经格式化,通常只是一行接一行,没有文本格式

“关键”或PO字段是第一个粗体项目,第二个粗体/斜体项目是要合计的成本。因此,如果要通过脚本id传递此示例,则需要添加第二行和第三行成本,因为它们都来自同一个采购订单号,第四行来自左侧

预期结果:

50900716482013-06-052013-09-05,P000001,1133997,223.010,202013-09-10104,xxxxxx,美联社 评论,002091

3010672013-09-062013-09-11,P000002,1133919,401.400,202013-10-31103,xxxxxx,美联社 评论,002143

3010672013-09-062013-09-11,P000003,1133910,23.690,202013-10-31103,xxxxxx,美联社 评论,002143

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


提前感谢您的关注

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

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

  • 祝你好运

    我会使用字典来编译这些行,如果已经存在值,则使用
    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])
    

    是的,我知道大写字母是用来表示类的,但这样可以更容易地说出我定义了哪些变量…

    我不确定对数据使用正则表达式,在我看来,它是
    csv
    格式是正确的方法:这就是
    csv
    模块的用途。哦,是的,我没有发现。或者CSV,如果有效的话。这确实是一个实施细节。非常感谢您的迅速和有益的响应。这里有一个非常好的社区。“上面的格式是为了便于阅读”:不要这样做。这就带来了一个新问题,很难判断你改变了什么。例如,评论是否总是在数据后的一行,或者它们在同一行,而您只是忘记了后面的逗号?抱歉,下次我会知道的。我只是想确保我解释得尽可能清楚。谢谢你的评论。太好了!这正是我想要的。只需要将其与当前脚本集成。非常感谢您的快速及时回复。