datagouv / geo.api.gouv.fr

Site Web de l'API Géo
https://geo.api.gouv.fr
32 stars 10 forks source link

Soucis dans la detection du dialect via le plugin addok-csv #80

Closed poudro closed 2 years ago

poudro commented 3 years ago

Bonjour,

Nous sommes tombés sur un souci lié à la detection automatique du dialect du csv (ici https://github.com/addok/addok-csv/blob/master/addok_csv/__init__.py#L63).

Je suis conscient que cette issue n'est pas forcement de votre ressort, mais je ne sais pas exactement ou la signaler autrement.

Le probleme surviens, pour nous, quand il y a des entrees qui contiennent des ' (single quote).

Par exemple

csv_file = '''idx,address
1,15 rue 'titi tyty' 60300
2,7 rue toto tata 60300
'''

dialect = csv.Sniffer().sniff(csv_file)

On a aura alors dialect.delimiter = ' ' (espace) et dialect.quotechar = "'" (single quote), ce qui est faux puisque les vrais valeurs devraient etre , et ".

Cela aura pour consequence de mal parser le flux en entree et de generer un csv mal formatte en sortie, voir de rendre le parsing impossible.

Avec les parametres par defaut, en self hosting, un exemple de requete etant:

r = requests.post(
    'http://localhost:7878/search/csv/',
    data={'columns': ['address'], 'encoding': 'utf-8'},
    files=[('data', csv_file)]
)

on aura l'erreur

'{"title": "Cannot found column \'address\' in columns [\'idx,address\']", "description": "Cannot found column \'address\' in columns [\'idx,address\']"}'

En faisant une requete sur api-adresse.data.gouv.fr on aura le csv envoye en retour.

De plus, dans la version self hosted d'Addok, il est possible d'override ces valeurs en passant les parametres delimiter et quote (d'ailleurs, il manque l'info pour quote dans la doc, qui est pourtant bien present dans le code, cf https://github.com/addok/addok-csv/blob/master/addok_csv/__init__.py#L75-L77).

Exemple de requete:

r = requests.post(
    'http://localhost:7878/search/csv/',
    data={'columns': ['address'], 'delimiter': ',', 'quote': '"', 'encoding': 'utf-8'},
    files=[('data', csv_file)]
)

Par contre, dans la version hosted sur api-adresse.data.gouv.fr on n'aura toujours pas le retour escompte, meme avec les parametres bien fournis.

Comment faire pour passer ces parametres delimiter et quote a l'API data.gouv ?

jdesboeufs commented 2 years ago

Bonjour,

L'instance hébergée ne supporte pas actuellement les paramètres quote et delimiter. La détection des paramètres de parsing CSV est réalisée au niveau d'un autre composant. La séparateur est détecté automatiquement, et le caractère "quote" est toujours ".

poudro commented 2 years ago

Bonjour @jdesboeufs

Merci pour la réponse ! Serait-il possible d'apporter de l'aide sur le composant qui fait le parsing pour ajouter cette fonctionnalité ? Si oui, pourriez-vous m'indiquer où elle se trouve ?

jdesboeufs commented 2 years ago

C'est cette fonction : https://github.com/BaseAdresseNationale/api-geocode/blob/master/lib/csv.js#L52 Sachant qu'ensuite le parsing est assuré par csv-parser.

Nous avons ajouté ce pré-parsing car le parsing de addok-csv est beaucoup trop fragile.

poudro commented 2 years ago

Merci !

poudro commented 2 years ago

réparé par https://github.com/BaseAdresseNationale/api-geocode/pull/13