Python:使用重用分隔符

时间:2017-05-04 16:00:28

标签: python parsing split delimiter

在Python中,我需要解析一个制表符分隔文件,该文件以问题:答案;问题:答案格式存储数据,您可以在其中输入一个或多个问题:答案对日期

不幸的是,如果一个问题有多个答案,分号使用,但仅用于界定答案部分。这个问题没有重复。
例如:
问题1:ANSWER1;问题2:ANSWER1; ANSWER2; ANSWER3;问题3:ANSWER1; ANSWER2

我想将其拆分为:
问题1:ANSWER1
问题2:ANSWER1
问题2:ANSWER2
问题2:ANSWER3
问题3:ANSWER1
问题4:ANSWER2

我现在拥有的只是分号,因此,它不起作用

with open('QA.txt', 'w', newline='') as tsv:
tsv.write("date\tQ:A\r\n")

for row in cursor:
    date = str(row[0])
    qa = str(row[1])


    if qa.count(';') == 0:
        tsv.write(
            date + '\t' + qa + '\r\n')
    else:
        b = qa.split(";")
        for c in range(0, qa.count(';')+1):
            tsv.write(date + '\t' + b[c] +'\r\n')



Cursor包含提取时间戳的查询结果和包含一个或多个问题的字符串:答案对
例如:
问题:答案;问题:答案;回答; 问题:答案
问题:答案;回答;问题:答案
问题:答案;问题:答案;回答;回答;回答;问题:答案;回答
问题:答案
问题:答案

基本上,问题是每个问题:答案对用分号分隔。但是,如果有多个答案,答案本身也是也用分号分隔

没有连续告诉会有多少对,或者,对于任何问题,将会有多少答案。

这是一个实际的数据线
2017-04-10 10:29:32.183 Gastrointestinal WDL:是的,除了;腹部描述:招标;扩张;圆形;肠鸣音:低活;恶心:没有
除此之外应该来 2017-04-10 10:29:32.183胃肠WDL:是的,除了 2017-04-10 10:29:32.183腹部描述:招标
2017-04-10 10:29:32.183腹部描述:扩张 2017-04-10 10:29:32.183腹部描述:圆形 2017-04-10 10:29:32.183肠鸣音:低活血性 2017-04-10 10:29:32.183恶心:不是

2 个答案:

答案 0 :(得分:0)

这是一个有效的代码示例。我无法看到你的光标变量存储的内容,所以我自己在顶部创建了它。

db.collection_name.update({first_name :'A'}, {$set : { "subjects.socialStudies" : "History" }})

这会在QA.txt中创建以下输出:

cursor = [['20170501', 'question1:answer1'], ['20170502', 'question2:answer1;answer2;answer3'],
          ['20170503', 'question3:answer1;answer2']]

with open('QA.txt', 'w', newline='') as tsv:
    tsv.write("date\tQ:A\r\n")

    for row in cursor:
        date = str(row[0])
        qa = str(row[1])

        qas = qa.split(":")

        question = qas[0]
        answers = qas[1]

        for answer in answers.split(";"):
            tsv.write(date + '\t' + question + ':' + answer + '\r\n')

请注意,我假设您在所需的输出中表示“question3:answer2”而不是“question4:answer2”。

答案 1 :(得分:0)

这是使用元组和子列表列表的另一种方法:

正如另一位用户在他们的回答中已经提到过的,我们并不确切知道你的文件结构是什么样的,因此,下面的答案只是使用一个分配给变量“entry”的字符串,以便于遵循我的解析方案。此代码有效,您需要做的就是使用.readlines()重新分配'entry'作为打开文件,然后使用for循环迭代输入文件列表。

String joined = strings.stream()
    .map(this::someOperation)
    .collect(Collectors.joining("\n"));