2013-05-27 6 views
0

J'ai un fichier avec les données suivantes:un motif Parsing chaîne (Python)

<<row>>12|xyz|abc|2.34<</row>> 
<<eof>> 

Le fichier peut avoir plusieurs lignes comme celle-ci. J'essaye de concevoir un analyseur qui analysera chaque rangée présente dans ce dossier et retournera un tableau avec toutes les rangées. Quelle serait la meilleure façon de le faire? Le code doit être écrit en python. Le code ne doit pas prendre les lignes qui ne commencent pas par <<row>> ou qui devrait déclencher une erreur.

=======> Mise à jour < ========

Je viens de découvrir qu'un <<row>> particulier peut couvrir plusieurs lignes. Donc, mon code et le code présent ci-dessous ne fonctionnent plus. Quelqu'un peut-il s'il vous plaît suggérer une solution efficace?

Les fichiers de données peuvent contenir des centaines à plusieurs milliers de lignes.

+3

On dirait une tâche assez simple. Où avez-vous des problèmes? – GolfWolf

+0

C'est une tâche simple que je connais mais je veux savoir comment un programmeur différent la résoudrait. Alors. –

+1

Affichez la solution que vous avez déjà. Vous obtiendrez des conseils pour l'améliorer. –

Répondre

1

Une façon simple, sans expressions régulières:

output = [] 
with open('input.txt', 'r') as f: 
    for line in f: 
     if line == '<<eof>>': 
      break 
     elif not line.startswith('<<row>>'): 
      continue 
     else: 
      output.append(line.strip()[7:-8].split('|')) 

Il utilise toutes les lignes commençant par <<row>> jusqu'à ce qu'une ligne ne contient que <<eof>>

1
def parseFile(fileName): 
    with open(fileName) as f: 

    def parseLine(line): 
     m = re.match(r'<<row>>(\d+)\|(\w+)\|(\w+)\|([\d\.]+)<</row>>$', line) 
     if m: 
     return m.groups() 

    return [ values for values in (
     parseLine(line) 
     for line in f 
     if line.startswith('<<row>>')) if values ] 

Et? Suis-je différent? ;-)

+0

Je suppose. Mais le faire sans utiliser d'expressions régulières est meilleur je crois. –

+0

Comment pouvez-vous croire cela ?? Regexp est plus général. Utiliser 'split' etc. est toujours une sorte d'utilisation d'une version spéciale pour un cas particulier. Dans le cas où une version légèrement modifiée du format apparaîtrait à l'avenir, ajuster l'expression rationnelle est un jeu d'enfant alors que créer une nouvelle version en utilisant des mécanismes d'analyse plus simples est rapidement incapable de faire face à la tâche. – Alfe

+0

La bibliothèque de chaînes est plus rapide. Donc, il serait plus logique pour moi de le faire sans utiliser regex car ces fichiers vont contenir des milliers de lignes. Ces fichiers contiennent des données que nous achetons d'un fournisseur de données, donc je n'ai pas le choix en termes de format de données d'entrée. –