2017-02-07 1 views
0

Le contenu du csv est la suivante:Comment extraire le contenu entre et Parenthèses (le cas échéant) dans une ligne de csv, en Python

"Washington-Arlington-Al, DC-VA-MD-WV (MSAD)" 47894 1976 
"Grand-Forks, ND-MN"       24220 2006 
"Abilene, TX"         10180 1977 

La sortie requise est lu par le csv, trouver contenu entre "" dans la colonne 1 et aller chercher seulement DC-VA-MD-WV, ND-MN, TX et mettre ce contenu dans une nouvelle colonne. (Pour la normalisation)

Jusqu'ici essayé beaucoup de modèles regex en python, mais n'a pas pu obtenir le bon.

sample=""" "Washington-Arlington-Al, DC-VA-MD-WV (MSAD)",47894,1976 
      "Grand-Forks, ND-MN",24220,2006 
      "Abilene, TX",10180,1977 """ 
open('sample.csv','w').write(sample) 
with open('sample.csv') as sample, open('output.csv','w') as output: 
    reader = csv.reader(sample) 
    writer = csv.writer(output) 
    for comsplit in row[0].split(','): 
     writer.writerow([ comsplit, row[1]]) 
    print open('output.csv').read() 

Résultat attendu est:

DC-VA-MD-WV 
ND-MN 
TX 

dans une nouvelle ligne

+0

N'aurait-il pas encore besoin d'un motif regex pour se diviser? (désolé joli nouveau à python) – Viv

Répondre

1

Il n'y a pas besoin d'utiliser regex ici fourni deux choses:

  1. La ville a toujours une virgule après suivi par 1 espace d'espaces (bien que je pourrais ajouter une modification à accepter (?) plus de 1 bit d'espace si nécessaire)
  2. Il y a un espace après votre séquence de lettres avant de rencontrer quelque chose comme (MSAD).

Ce code donne à votre sortie attendue contre l'entrée de l'échantillon:

with open('sample.csv', 'r') as infile, open('expected_output.csv', 'wb') as outfile: 
    reader = csv.reader(infile) 
    expected_output = [] 
    for row in reader: 
     split_by_comma = row[0].split(',')[1] 
     split_by_space = split_by_comma.split(' ')[1] 
     print split_by_space 
     expected_output.append([split_by_space]) 

    writer = csv.writer(outfile) 
    writer.writerows(expected_output) 
1

Je ferais comme ça:

with open('csv_file.csv', 'r') as f_in, open('output.csv', 'w') as f_out: 
    csv_reader = csv.reader(f_in, quotechar='"', delimiter=',', 
          quoting=csv.QUOTE_ALL, skipinitialspace=True) 
    csv_writer = csv.writer(f_out) 
    new_csv_list = [] 
    for row in csv_reader: 
     first_entry = row[0].strip('"') 
     relevant_info= first_entry.split(',')[1].split(' ')[0] 
     row += [relevant_info] 
     new_csv_list += [row] 
    for row in new_csv_list: 
     csv_writer.writerow(row) 

Laissez-moi savoir si vous avez des questions.

+0

Cela ne donne pas la sortie attendue dans 'new_csv_list' Je viens de le tester – roganjosh

+0

Ouais désolé, je vais le modifier dans une seconde. Il manque juste une option. – Outis

+0

Ok, parce que j'ai un code fonctionnel prêt mais je vais vous donner une chance de résoudre ce problème avant de poster une réponse. – roganjosh

0

Il semble que vous rencontrez des difficultés à trouver le bon regex à utiliser pour trouver les valeurs attendues.

J'ai créé un petit échantillon pythext qui répondra à vos besoins.

Fondamentalement, lorsque vous vérifiez le contenu de toutes les valeurs de la première colonne, vous pouvez utiliser une expression régulière comme /(TX|ND-MN|DC-VA-MD-WV)/

J'espère que cela a été utile! Faites-moi savoir si vous avez besoin d'explications supplémentaires.

+0

Cela ne fonctionne que pour cet exemple très spécifique? Ce n'est pas une règle générale qui pourrait être appliquée en fonction de la structure du fichier et non de son contenu: – roganjosh

+0

comme '/ [AZ] {2} /' mais je ne suis pas sûr que c'est exactement ce que vous cherchez – mabe02

+0

Je ne suis pas l'OP :) – roganjosh

1

Je crois que vous pouvez utiliser ce modèle regex, qui extraira toute expression alphanumérique (avec trait d'union ou non) entre une virgule et une parenthèse:

import re 
BETWEEN_COMMA_PAR = re.compile(ur',\s+([\w-]+)\s+\(') 
test_str = 'Washington-Arlington-Al, DC-VA-MD-WV (MSAD)' 
result = BETWEEN_COMMA_PAR.search(test_str) 
if result != None: 
    print result.group(1) 

Cette imprimera en conséquence: DC-VA-MD-WV, comme prévu .