J'essaie de lire les données du fichier csv, diviser chaque ligne en colonnes respectives.

Mais mon expression rationnelle échoue lorsqu'une colonne particulière a des virgules avec en soi .

Par exemple: a, b, c, "d, e, g,", f

Je veux un résultat comme:

a    b    c    "d,e, g,"    f  

Qui est de 5 colonnes.

Voici l'expression rationnelle que j'utilise pour diviser la chaîne par une virgule

, (? = (?: "[^"] ? (?: [^ "] ) *)) |, (? = [^"] + (?:,) |, + | $)

Mais il échoue pour quelques chaînes alors qu'il fonctionne pour d'autres.

Tout ce que je recherche, c'est que lorsque je lis des données de csv en utilisant pyspark dans dataframe / rdd, je veux charger / conserver toutes les colonnes sans aucune erreur

Merci

3
Alekhya Vemavarapu 9 août 2016 à 19:06

3 réponses

Meilleure réponse

Beaucoup plus facile avec l'aide du nouveau module regex :

import regex as re

string = 'a,b,c,"d,e, g,",f'
rx = re.compile(r'"[^"]*"(*SKIP)(*FAIL)|,')

parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f']

Il prend en charge le mécanisme (*SKIP)(*FAIL), qui ignore tout entre les guillemets doubles dans cet exemple.


import regex as re

string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''
rx = re.compile(r'".*?(?<!\\)"(*SKIP)(*FAIL)|,')
parts = rx.split(string)
print(parts)
# ['a', 'b', 'c', '"d,e, g,"', 'f', ' this', ' one', ' with "escaped "double",quotes:""']

Voir une démo pour ce dernier sur regex101.com .


csv
import csv
string = '''a,b,c,"d,e, g,",f, this, one, with "escaped \"double",quotes:""'''

# just make up an iterable, normally a file would go here
for row in csv.reader([string]):
    print(row)
    # ['a', 'b', 'c', 'd,e, g,', 'f', ' this', ' one', ' with "escaped "double"', 'quotes:""']
3
Jan 10 août 2016 à 09:05

Essayez \,(?=([^"\\]*(\\.|"([^"\\]*\\.)*[^"\\]*"))*[^"]*$).

cette réponse qui explique comment faire correspondre tout ce qui a été utilisé n'est pas entre guillemets et ignore les guillemets échappés et http://regexr.com/ à tester.

Notez que, comme d'autres réponses à votre question, il existe de meilleures façons d'analyser CSV que d'utiliser une expression régulière.

3
Erwin Rooijakkers 9 août 2016 à 16:11

Vous ne pouvez pas facilement analyser des fichiers CSV avec regex.

Ma boîte à outils préférée pour gérer CSV à partir de la ligne de commande Unix est csvkit, que vous pouvez obtenir à partir de https: / /csvkit.readthedocs.io. Il possède également une bibliothèque Python.

Les documents Python pour la bibliothèque csv standard sont ici: https://docs.python.org /2/library/csv.html

Il y a une discussion approfondie sur l'analyse de CSV ici:

https://softwareengineering.stackexchange.com/questions/166454/can-the-csv-format-be-defined-by-a-regex

C'est un chemin bien parcouru et les bibliothèques sont suffisamment bonnes pour que vous ne deviez pas rouler votre propre code.

3
Community 12 avril 2017 à 07:31