在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恶心:不是
答案 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"));