2017-05-04 1 views
1

En Python, j'ai besoin d'analyser un fichier délimité par tabulation qui stocke des données dans un format question: réponse; question: réponse où vous pouvez avoir une ou plusieurs questions: une date

Malheureusement, s'il y a plusieurs réponses à une question, le point-virgule est également utilisé, mais seulement pour délimiter la partie réponse. La question ne se répète pas. Par exemple:
question1: réponse1; question2: réponse1; réponse2; réponse3; question3: answer1; Réponse2

Je voudrais partager ceci à:
Question1: answer1
question2: answer1
question2: Réponse2
question2: Réponse3
question3: answer1
question4: Réponse2
Python: fractionnement d'un résultat de requête avec un délimiteur réutilisé

ce que j'ai en ce moment, ne se divise sur le point-virgule, donc, il ne fonctionne pas

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



curseur contient les résultats d'une requête qui tire une estampille temporelle et une chaîne qui contient un ou plusieurs question: paires de réponses
Exemple:
question: réponse; Question Réponse ; répondre; question: réponse
question: réponse; répondre ; question: réponse
question: réponse; Question Réponse ; répondre ; répondre ; répondre ; Question Réponse ; répondre
question: répondre
question: réponse

Essentiellement, le problème est que chaque question: paire de réponse est délimitée par un point-virgule. Mais, s'il y a plus d'une réponse, les réponses elles-mêmes sont également délimitées par un point-virgule.

On ne sait pas combien de paires il y aura ou, pour toute question, combien de réponses il y aura.

Voici une ligne de données réelle
2017-04-10 10: 29: 32.183 WDL gastro-intestinale: Oui, sauf pour; Description de l'abdomen: Tender; Distended; Round; Sons intestinaux: hypoactifs; Nausées: Non

Sur qui doit venir
10/04/2017 10: 29: 32,183 Gastro-intestinal BNM: Oui, à l'exception
10/04/2017 10: 29: 32,183 Abdomen Description: Appel d'offres
2017- 4 au 10 octobre: ​​29: 32,183 Abdomen description: distendu
10/04/2017 10: 29: 32,183 Abdomen description: Round
10/04/2017 10: 29: 32,183 Bruits intestinaux: hypoactif
2017-04- 10 10: 29: 32.183 Nausée: Non

Répondre

0

Voici un exemple de code de travail. Je ne pouvais pas voir ce que votre variable curseur stockait, donc je l'ai créé moi-même en haut.

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

Cela crée la sortie suivante dans le contrôle qualité.txt:

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

Notez que je suppose que vous vouliez dire « question3: Réponse2 » au lieu de « question4: Réponse2 » dans la sortie désirée.

+0

De temps en temps, votre script crée des lignes à la question: la question – user3219388

+0

intéressante, pouvez-vous me dire l'entrée qui fait et je peux le réparer? –

+0

On dirait que le problème est quand ils posent deux fois la même question. Exemple, voici la source:
score_dt \t gastro 05/11/2015 02: 17: 33,000 \t Gastro-intestinal BNM: Oui, à l'exception; Gastrointestinal BNM: Oui, sauf pour

Ce qui sort de qui est
2015-11- 05 02:17:33 \t Appareil digestif WDL: Oui, sauf pour
2015-11-05 02:17:33 \t Appareil digestif WDL: Appareil digestif WDL
user3219388

0

Voici une autre approche en utilisant une liste de tuples et sous-listes:

Comme un autre utilisateur déjà mentionné dans leur réponse, nous ne savons pas exactement ce que la structure de votre fichier ressemble donc ma réponse ci-dessous utilise juste une chaîne assignée à variable 'entrée' pour la facilité de suivre mon schéma d'analyse. Ce code fonctionne et tout ce que vous devez faire est de réaffecter 'entry' en ouvrant votre fichier en utilisant .readlines(), puis en itérant simplement sur la liste des fichiers d'entrée en utilisant une boucle 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')