Problème incohérence de donnée lors de la lecture fichier csv

Bonjour les codeurs,

Je cherche une piste pour éviter l’incohérence des données lors de la lecture d’un fichier CSV.
Comme dans le cours de maxime j’essaie de lire un fichier csv.

Task.init {
    if let sourceFichier = URL(string: "https://static.data.gouv.fr/resources/fichier-consolide-des-bornes-de-recharge-pour-vehicules-electriques/20220703-081700/consolidation-etalab-schema-irve-v-2.0.2-20220702.csv") {
        for try await line in sourceFichier.lines {
            let  colonnes = line.split(separator: ",")
            let nom_amenageur = colonnes[0]
            let siren_amenageur = colonnes[1]
            let contact_amenageur = colonnes[2]
            let nom_operateur = colonnes[3]
            let contact_operateur = colonnes[4]
            let telephone_operateur = colonnes[5]
            let nom_enseigne = colonnes[6]
            let id_station_itinerance = colonnes[7]
            let id_station_local = colonnes[8]
            let nom_station = colonnes[9]
            let implantation_station = colonnes[10]
            let adresse_station = colonnes[11]
            let code_insee_commune = colonnes[12]
            let coordonneesXY = colonnes[13]
            let nbre_pdc = colonnes[14]
            let id_pdc_itinerance = colonnes[15]
            let id_pdc_local = colonnes[16]
            let puissance_maximale = colonnes[17]
            let prise_type_ef = colonnes[18]
            let prise_type_2 = colonnes[19]
            let prise_type_combo_ccs = colonnes[20]
            let prise_type_chademo = colonnes[21]
            let prise_type_autre = colonnes[22]
            let paiement_acte = colonnes[23]
            let paiement_autre = colonnes[24]
            let condition_acces = colonnes[25]
            let reservation = colonnes[26]
            let horaires = colonnes[27]
            let accessibilite_pmr = colonnes[27]
            let restriction_gabarit = colonnes[28]
            let station_deux_roues = colonnes[29]
            let raccordement = colonnes[30]
            let num_pdl = colonnes[31]
            let date_mise_en_service = colonnes[32]
            let observations = colonnes[33]
            let date_maj = colonnes[34]
            let last_modified = colonnes[35]
            let datagouv_dataset_id = colonnes[36]
            let datagouv_resource_id = colonnes[37]
            let datagouv_organization_or_owner = colonnes[38]
            let consolidated_longitude = colonnes[39]
            let consolidated_latitude = colonnes[40]
            let consolidated_code_postal = colonnes[41]
            let consolidated_commune = colonnes[42]
            let consolidated_is_lon_lat_correct = colonnes[43]
            let consolidated_is_code_insee_verified = colonnes[44]
            let essai = colonnes[46]
            //print("\(nom_station) -- \(adresse_station) -- \(implantation_station) -- \(puissance_maximale)")
           print("\(essai)")
            
            //if nom_amenageur.count >= 3 {
              //  break
            //}
        }
        print("fin de lecture")
    }
}

j’ai l’impression que si une donnée contient une « , » tout se décale, l’entête ne correspond plus à la colonne se qui est le cas pour la colonne
coordonneesXY (13)
[-0.56711100,44.89088900]

-0.56711100 se trouve bien colonne 13, mais 44.89088900] se trouve dans la colonne 14, et les colonnes d’après sont décalées par rapport aux entêtes. C’est le bazar.

J’ai l’impression aussi que le décalage peut se faire en pleine lecture et donc la donnée de résultat n’est pas celle attendue ? exemple,

pour les colonnes consolidated_longitude (43) ou consolidated_latitude (44)
48.663549
apeira-technologies
48.919807
40230
11430
45.9221544
societe-d-installation-de-plomberie-electricite-chauffage-et-climatisation
5.24

On se retrouve avec du texte et des codes postaux en plein milieu d’une colonne de coordonnée GPS, à première vu sous réserve en conversion sous Excel le fichier semble. je souhaite savoir si d’autres personnes ont été confronté et les pistes à envisagé pour traiter des données cohérentes

pour éviter le décalage de colonne je peux tester si la virgule est le dernier caractère de la chaine pour le split
let colonnes = line.split(separator: « , »)

Merci pour les retours
Bonne soirée

C’est exactement ça le problème. si ton texte contient des « , » cela va décaler les colonnes.
Comment tes données sont elles récupérées à la base? format CSV obligatoire?

  • tu peux mettre le signe « , » de la phrase entre guillemets pour que cela ne soit pas considéré comme un séparateur.
  • tu peux choisir un autre séparateur pour l’export en passant par Excel (vu que tu l’utilises). Tu peux choisir une tabulation, un point-virgule ou autre.

Je t’invite à te renseigner sur le format CSV via la page wikipedia. Cela te permettra de mieux comprendre et de trouver une solution qui te convient dans la façon de le traiter.

@Mrt1 merci je vais étudier tout cela, pour que les données soient exploitables
Bonne soirée

Salut @titastus

Vu que le fichier est un fichier généré par

Je suppose que tu ne peux pas changer les paramètres de sortie (remplacer les virgules par des point-virgules ou des tabulations par exemple).

Le lien du fichier de ton post initial n’est pas ou plus valide.

Aurais-tu le fichier en question à partager ici ?

Il doit bien avoir un moyen de convertir tout ça.

Cédric

salut @cedric06nice

exacte le lien de téléchargement directe ne fonctionne plus, donc je suis repartit sur un lien pour télécharger le fichier bornes de recharges

par contre il faut héberger le ficher soi même, au commencement pour mes premiers tests, j’étais sur cette solution.

j’espère avoir répondu à ta question.

Bonsoir,
je viens de convertir le fichier csv avec comme séparateur le « ; » c’est déjà mieux (test rapide)

nom_station(9) – adresse_station(11) – coordonneesXY(13)
Bordeaux - Novotel Bordeaux Lac – rue Jean Samazeuilh 33300 Bordeaux [-0.56711100,44.89088900]
Le Plessis-Robinson - La Boursidière – Rue de la Boursidière 92350 Le Plessis-Robinson – [2.23831600,48.77322500]
Beaune - Greet Hotel – 58 route de Verdun 21200 Beaune --[4.85182600,47.00953800]

tout cela reste à retravailler, merci pour la piste
Bonne soirée

De rien, le CSV est un peu particulier et pas le meilleur je trouve pour gérer des data avec des adresses notamment ou du texte long (enfin dès qu’une donnée peut contenir une virgule surtout…).
En connaissant mieux le format, on peut mieux traiter en amont les données pour ensuite les utiliser.

Bon code à toi :slight_smile:

1 « J'aime »

Bonjour les codeurs,

Pour les personnes qui comme moi manipulent des fichiers CSV, j’ai découvert un petit utilitaire sous Mac (dispo App Store) Table Tool qui respecte bien plus les normes que le fait Excel.

Table Tool, éditeur qui fait le Job, c’est mon avis je ne suis pas expert
Bonne fin de week-end.

3 « J'aime »