Closed Samuelfaure closed 5 years ago
J'ai détecté un problème similaire avec la lib SmarterCSV côté _sirene_asapi.
S'il manque une colonne dans les lignes ça crée un décalage à l'import. Et SmarterCSV ne lève pas d'erreur ; il ne lève d'erreur que si le nombre de colonnes du header est incorrect mais rien si une des lignes de données n'a pas le bon nombre de colonnes.
J'ai regardé rapidement les options disponibles dans SmarterCSV sans succès...
@brindu FYI
A voir en effet, l'idéal serait de trouver le fichier CSV en question pour s'assurer que c'est bien la source du problème... J'ai moi aussi regardé ça sans succès jusqu'ici.
J'ai un peu fouillé la question grâce à notre exemple ici :
=> ag 'CABINET SALUSTRO REYDEL'
=> Croiser les résultats avec un grep '36'
(date dernière modification décalée ici)
=> Trouver ce genre de lignes : (exemple ici fichier IMR_Donnees_Saisies/tc/flux/2019/01/17/3102/436/3102_436_20190117_085826_6_rep_nouveau_modifie_EVT.csv:21:3102;
)
Toulouse;1981B00419;321969297;P. Morale;;;;;"CABINET SALUSTRO REYDEL";652044371;"Société par actions simplifiée";;"2 Avenue Gambetta";"Tour Eqho Paris la Defense";92066;"Courbevoie Cedex ;";"92026";"France";;;;;"commissaire aux comptes suppléant";;;;;;;;;;;;;;;;;;;;;36;2018-04-19;Modifications relatives au(x) dirigeants
A regarder de plus près on voit ce champs : ;";
Je ne sais pas si on a pris ce cas en compte (en tout cas je ne l'ai pas trouvé dans le code).
Ceci expliquerait le décalage : de mes tests, le 2eme séparateur ;
est ici entre double quotes... D'ou perte d'un header sur la ligne et décalage...
Le :force_simple_split
permet de ne pas avoir d'erreur mais n'empeche pas ce décalage.
J'ai fouillé un peu plus loin pour vérifier la thèse de @Haelle :
Soit un fichier output_rncs.txt contenant le output de ag 'CABINET SALUSTRO REYDEL' | grep '36'
la commande awk -F\; '{print NF-1}' output_rncs.txt
renvoie le nombre de ;
par ligne :
47
46
46
47
47
47
Or les headers correspondants à ces fichiers n'ont que 46 ';'...
Fichiers avec 47 ';' :
IMR_Donnees_Saisies/tc/flux/2018/04/20/3102/245/3102_245_20180420_062836_6_rep_nouveau_modifie_EVT.csv
IMR_Donnees_Saisies/tc/flux/2018/05/26/3102/271/3102_271_20180526_065933_6_rep_nouveau_modifie_EVT.csv
IMR_Donnees_Saisies/tc/flux/2019/01/17/3102/436/3102_436_20190117_085826_6_rep_nouveau_modifie_EVT.csv
IMR_Donnees_Saisies/tc/flux/2019/02/06/3102/451/3102_451_20190206_102229_6_rep_nouveau_modifie_EVT.csv
Et si on compare les headers à la ligne correspondante dans les fichiers :
Headers => Code_Postal;Ville;Code_Commune;Pays
Total 4 champs
Ligne => 92066;"Courbevoie Cedex ;";"92026";"France"
Total 5 champs
Un ;
en trop sur la ligne.... d'ou decalage... comme par hasard à l'endroit du fameux ;";
...
Conclusion : on a des randoms champs en trop qui se baladent....
A priori on peut tenter de traiter ça plutot facilement avec un prétraitement (sed /;\";/;/) mais c'est rageant niveau qualité des données...
Je ne suis pas un grand fan du sed
, le problème vient bien de la donnée au départ.
La qualité des CSV sources étant ce qu'elle est, on a fait le choix d'utiliser le caractère ";" pour délimiter les colonnes au parsing des fichiers CSV, et je ne vois pas comment nous pourrions faire autrement puisque les conventions d'utilisation des guillemets ne sont pas respectées. Pour les quatre valeurs 92066;"Courbevoie Cedex ;";"92026";"France"
les guillemets sont bien présents. Seulement ce n'est pas le cas partout, le début de cette même ligne, par exemple, le voici : 3102;Toulouse;1981B00419;321969297;P. Morale;
. Là, plus de guillemets et seul le point-virgule permet de faire la séparation entre les colonnes.
On va difficilement pouvoir parser des fichiers CSV en faisant varier les règles au sein d'une même ligne.
Je ne pense pas que le sed
soit la solution car nous rencontrerons le problème à chaque fois qu'il y aura un point-virgule dans la valeur d'un champ. Ex : on peut imaginer une observation qui ressemblerait à ceci : "Liquidation judiciaire ; radiée du registre", et ceci passera au travers du sed
.
Je ne vois pas encore de solution en l'état, j'ai demandé à l'INPI ce qu'il en est de leur côté :
Mail reçu le 5 juillet 2019 :
Sur la recherche suivante :
SIREN : 321969297
"dossier_entreprise_greffe_principal": { "id": "e05d6d13-bb57-4c02-9769-c16455c0411d",
Dans la partie représentant, il y a un décalage des valeurs des champs suite à un null pour un id_representant
Idem lorsque le code_commune est null (même enregistrement)