2017-05-04 5 views
1

Pythonでは、データを格納するタブ区切りファイルを解析する必要があります。質問:回答;質問:回答形式1つ以上の質問:日付

残念ながら、質問に複数の回答がある場合、セミコロンはでもですが、回答部分を区切るためにのみ使用されます。質問は繰り返されません。
例:
質問1:回答1;質問2:回答1;回答2;回答3; question3:ANSWER1;私はこれを分割したいANSWER2


question1:ANSWER1
question2:ANSWER1
question2:ANSWER2
question2:ANSWER3
question3:ANSWER1
question4:ANSWER2
Python:再利用された区切り文字でクエリ結果を分割する

私は今のところセミコロンを分割するだけなので、うまくいきません。

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') 



カーソルは、タイムスタンプと1つ以上の質問が含まれた文字列引くクエリの結果が含ま:回答ペア
例:
質問:答えを。質疑応答 ;回答; 質問:回答
質問:回答;答え。質問:回答
質問:回答;質疑応答 ;答え。答え。答え。質疑応答 ;回答
質問:回答
質問:回答
本質的に問題は、各質問:回答のペアがセミコロンで区切られていることです。しかし、複数の回答がある場合は、回答自体ははセミコロンで区切られています。

どのような数のペアが存在するか、どの質問に対して何の回答があるかは行には分かりません。

ここに実際のデータラインがあります
2017-04-10 10:29:32.183胃腸のWDL:はい、例外を除いて;腹部説明:入札;拡張;ラウンド;腸音:催眠作用;吐き気:29:32.183胃腸WDL:いいえ
は、そのうち
が 2017年4月10日10
に来るべきではありませんはい、の場合を除き
2017年4月10日10:29:32.183腹部説明:テンダー
2017- 04-10 10:29:32.183腹部説明:膨張
2017年4月10日10:29:32.183腹部説明:ラウンド
2017年4月10日10:29:32.183腸の音:
2017-04-機能低下を10 10:29:32.183吐き気:いいえ

答えて

0

実用的なコード例を示します。私はあなたのカーソル変数が格納していたものを見ることができなかったので、私は自分自身を一番上に作成しました。

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') 

これにより、QAに次の出力が作成されます。ご希望の出力に: "ANSWER2 question4": "ANSWER2 question3" の代わりに:TXT、私はあなたが意味するものと仮定してい

date Q:A 
20170501 question1:answer1 
20170502 question2:answer1 
20170502 question2:answer2 
20170502 question2:answer3 
20170503 question3:answer1 
20170503 question3:answer2 

注意。ここで

+0

時折、あなたのスクリプトは、質問と行を作成しています:興味深い質問 – user3219388

+0

は、あなたは私のことが発生した入力を伝えることができて、私はそれを修正することができますか? –

+0

問題が同じ質問を2回聞いているようです。例は、ここにソースです:
score_dt \t胃 2015年11月5日02:17:33.000 \t胃腸WDL:はい、を除いて、胃腸WDL:はい、

以外の何というのが出てくる
2015-11-です05 02:17:33 \t消化管WDL:はい、除外
2015-11-05 02:17:33 \t胃腸管WDL:胃腸管WDL
user3219388

0

はタプルとサブリストのリストを使用して別のアプローチです:

をすでに彼らの答えで述べた別のユーザーとして、私たちはそれゆえ、以下の私の答えはちょうど割り当てられた文字列を使用して、あなたのファイル構造がどのように見える正確に把握していません私の構文解析スキームを簡単に実行できるように、変数 'entry'に変換します。このコードは機能し、あなたがする必要があるのは、.readlines()を使ってファイルを開くときに 'entry'を再割り当てし、forループを使って入力ファイルリストを繰り返し処理するだけです。

# let's take an example entry from the tab delimited file 
entry = 'date\tquestion1:answer1; question2:answer1;answer2;answer3; question3:answer1;answer2' 

parse1 = entry.split('\t') 
date = parse1[0] 

qa = parse1[1] 

# split by the whitespace 
parse2 = qa.split(' ') 

# Create an empty list to concatenate tuples to 
q_tup_lst = [] 

for i in parse2: 

    parse3 = i.split(':') 
    q_tup = ((parse3)) 
    q_tup_lst.append(q_tup) 


new_lst = [] 

for j in q_tup_lst: 

    parse4 = j[1].split(';') 

    if '' in parse4: 
     parse4.pop() 
     new_lst.append((j[0], parse4)) 

    else: 
     new_lst.append((j[0], parse4)) 

for nn in new_lst: 
    for oo in nn[1]: 

     print (nn[0] + ':' + oo + '\n') 
関連する問題