2013-07-13 2 views
2

Je cherche à le faire en python ou dans un script shell de base.Variables lors de la lecture d'un fichier contenant plusieurs lignes dans une liste - python ou shell

J'ai un fichier avec plusieurs entrées que je voudrais manipuler ses données et les stocker dans des variables.

Le fichier comporte des lignes comportant plusieurs colonnes. La première colonne est le nom d'une personne (c'est-à-dire Joe, Mary, etc.). Le second (après la virgule) est un identifiant. Je voudrais stocker chaque ID dans une variable et ensuite construire des liens comme indiqué ci-dessous. Le problème est que l'un nom ne peut avoir qu'un seul ID ou multiple, comme vous pouvez le voir ci-dessous:

Joe, 21142 21143 21909 24125 
Mary, 22650 23127 
John, 24325 
Mike, 24683 24684 26973 

Comment puis-je stocker chaque valeur dans la « deuxième colonne » dans une variable afin que je puisse ensuite construire des liens comme celui-ci :

http://example/Joe/21142 
http://example/Joe/21143 
http://example/Joe/21909 
http://example/Joe/24125 
http://example/Mary/22650 
http://example/Mary/23127 

Merci d'avance!

  • Omar

Répondre

1

peut être fait avec GNU awk

awk -F'[, ]+' '{for (i=2; i<=NF; ++i) print "http://example/"$1"/"$i }' input.txt 
http://example/Joe/21142 
http://example/Joe/21143 
http://example/Joe/21909 
http://example/Joe/24125 
http://example/Mary/22650 
http://example/Mary/23127 
http://example/John/24325 
http://example/Mike/24683 
http://example/Mike/24684 
http://example/Mike/26973 

Ou en Python

s = '''Joe, 21142 21143 21909 24125 
Mary, 22650 23127 
John, 24325 
Mike, 24683 24684 26973 
''' 
from StringIO import StringIO 
from contextlib import closing 
with closing(StringIO(s)) as f: 
    for line in f: 
      x, y = line.split(',') 
      x = x.strip() 
      y = y.strip().split() 
      leader = 'http://example/{}'.format(x) 
      print '\n'.join('{}/{}'.format(leader, z) for z in y) 
+0

Excellent! Merci!!!! Cela a fonctionné très bien! – Omar

+0

@Omar, bon à savoir! – iruvar

0

Essayez

myfile = open('input','r') 
link = dict() 
for line in myfile: 
    line = line.split(",") 
    IDs = line[1].split() 
    link[line[0]]=IDs 
myfile.close() 

for name in link.keys(): 
    for ID in link[name]: 
     print ''.join(["www.whatever.com/",name,"/",ID]) 
+0

Cela a fonctionné aussi bien! Je vous remercie!!!! – Omar

0

Tout d'abord, puisque vous réutilisez l'URL, de son mieux pour créer un modèle réutilisable. Puisqu'un nom peut avoir plusieurs identifiants, vous devez exécuter une autre boucle dans la boucle principale pour générer chaque URL. Le code ci-dessous devrait fonctionner.

url_template = "http://example/%s/%d" 
with open("input.file") as f: 
    for line in f: 
     name = line.split(',')[0].strip() 
     n_ids = line.split(',')[1].strip().split(' ') 
     for n_id in nids: 
      print url_template % (name, nid) 
+0

Merci! Malheureusement, j'obtiens cette erreur: '$ python test.py Traceback (appel le plus récent en dernier): Fichier" test.py ", ligne 2, en avec open (" test.file ") comme f: IOError: [Errno 2] Aucun fichier ou répertoire: 'test.file'' – Omar

+0

hey, vous devez y mettre votre nom de fichier. Quel est ton nom de fichier? Avez-vous même compris mon code? –

0

Je suppose que je suis en retard à ce parti, pourrait aussi bien l'action:

lines = '''Joe, 21142 21143 21909 24125 
Mary, 22650 23127 
John, 24325 
Mike, 24683 24684 26973''' 

    linesList = lines.split("\n") 
    for line in linesList: 
     lineList = line.split(",") 
     lineName = lineList[0]; 
     lineNumbers = lineList[1].split(" ") 
     for lineNumber in lineNumbers: 
      if lineNumber.isdigit(): 
       print("http://example.com/" + lineName + "/" +lineNumber) 
1

réponse bash: la commande de lecture ope évalue les lignes par rapport au fichier et saisit les mots séparés par des virgules ou des espaces dans un tableau

while IFS=$', \t' read -ra words; do 
    for ((i=1; i<${#words[@]}; i++)); do 
     printf "http://example/%s/%s\n" "${words[0]}" "${words[i]}" 
    done 
done < file 
Questions connexes