Récupération de fichier CSV

Bonjour tout le monde,
Je rencontre un soucis, j’ai téléchargé un fichier CSV que j’ai importé dans Xcode en SwiftUI depuis data.gouv : https://www.data.gouv.fr/fr/datasets/liste-des-services-de-police-accueillant-du-public-avec-geolocalisation/

J’arrive à récupérer les données en String et me créer des objets avec, sauf la latitude et longitude.
Je n’arrive pas à les transformer en CLDegree ou même seulement en Double.
Du coup je suis pas mal bloqué.

Ma Structure :

struct StationStruct:Identifiable {
    var id = UUID()
    service:String
    let addressGeo:String
    let phoneNumber:String
    let department:String
    let codeCommon:String
    let codeZip:String
    let common:String
    let address:String
    let latitude:Double
    let longitude:Double
    let coordinate:CLLocationCoordinate2D
    
    
    init(csv: String) {
        let fields = csv.components(separatedBy: ";")
        guard fields.count == 12 else {return nil}
        service = fields[0]
        addressGeo = fields[1]
        phoneNumber = fields[2]
        department = fields[3]
        codeCommon = fields[4]
        codeZip = fields[6]
        common = fields[7]
        address = fields[5]
        latitude = Double(fields[11]) ?? 100.00
        longitude = Double(fields[12]) ?? 100.00
        coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
    }
}

Ma récupération du fichier CSV:

@Published var arrayStation:[StationStruct] = []
@Published var mapLocation: MKCoordinateRegion = MKCoordinateRegion(center: CLLocationCoordinate2D(latitude: 43.124228, longitude: 5.928), span: MKCoordinateSpan(latitudeDelta: 0.5, longitudeDelta: 0.5))
    
    init() {
           loadCsvPoliceStation(csvName: "police")
        }

func loadCsvPoliceStation(csvName: String) -> [StationStruct] {
                var csvToStruct = [PoliceStationStruct]()
              guard let filePath = Bundle.main.path(forResource: csvName, ofType: "csv") else {return []}
                var dataString = ""
                do {
                    dataString = try String(contentsOfFile: filePath)
                } catch {
                    print(error.localizedDescription)
                    return []
                }
                var rows = dataString.components(separatedBy: "\n")
                let columnsCount = rows.first?.components(separatedBy: ";").count
                rows.removeFirst()
                for row in rows {
                    let csvColumns = row.components(separatedBy: ";")
                    if csvColumns.count == columnsCount {
                        let pnStruct = StationStruct.init(rawCSV: csvColumns)
                        print("\(pnStruct.service)\(pnStruct.address) Latitute : \(pnStruct.latitude) Longitute : \(pnStruct.longitude) Coordinate : \(pnStruct.coordinate)")
                        csvToStruct.append(pnStruct)
                    }
                }
                return csvToStruct

Si quelqu’un à une solution à me proposer pour que je puisse utiliser toutes les données je suis preneur :slight_smile:

Salut @PapaRoack !

Est-ce que tu pourrais ajouter un exemple de JSON reçu pour un objet Station ainsi que l’erreur exacte que tu obtiens ?

Happy coding!

Bonjour @mbritto ,
Alors je n’ai pas de Json, juste un fichier CSV que j’ai intégré directement a Xcode, contrairement à ton cours sur AsyncSequence des nouveautés IOS 15 où tu les téléchargent depuis internet (d’ailleurs le problème rencontré est le même de cette façon).

Un exemple de mon fichier CSV :

service;adresse_geographique;telephone;departement;code_commune_insee;voie;code_postal;commune;geocodage_epsg;geocodage_x;geocodage_y;geocodage_x_GPS;geocodage_y_GPS
"Commissariat de police d'Oyonnax";"41 Boulevard Louis Dupuy$01100 OYONNAX";"+33 4 74 77 47 33";"01";"01283";"41 Boulevard Louis Dupuy";"01100";"OYONNAX";"";"";"";"5.65029996";"46.25760162"
"Commissariat de police de Bourg en Bresse";"4 Rue des Remparts$01000 BOURG EN BRESSE";"+33 4 74 47 20 20";"01";"01053";"4 Rue des Remparts";"01000";"BOURG EN BRESSE";"";"";"";"5.22517643";"46.20676468"
"Commissariat de police de Château Thierry";"Avenue de la Mare aux Canes$02400 CHATEAU THIERRY";"+33 3 23 84 26 26";"02";"02168";"Avenue de la Mare aux Canes";"02400";"CHATEAU THIERRY";"";"";"";"3.38927094";"49.04801921"

Lien de mon fichier CSV :
CSV

Et en soit je n’ai pas d’erreur, seulement j’arrive a récupérer toutes les données en String (Substring exactement)
Mais j’aimerai me servir de la latitude et de la longitude sur la MAP, donc il me les faut en double voir directement en CLLocationDegrees.
Et c’est la que ca bloque, je peux seulement les récupérer en String, et par la suite je ne peux même pas les convertir car elles ressortent nil

Du coup j’ai essayé de transformer mon fichier CSV en Json grace à JsonLint

Exemple du Json :


[
  {
    "service": "Commissariat de police d'Oyonnax",
    "adresse_geographique": "41 Boulevard Louis Dupuy$01100 OYONNAX",
    "telephone": "+33 4 74 77 47 33",
    "departement": "01",
    "code_commune_insee": "01283",
    "voie": "41 Boulevard Louis Dupuy",
    "code_postal": "01100",
    "commune": "OYONNAX",
    "geocodage_epsg": "",
    "geocodage_x": "",
    "geocodage_y": "",
    "geocodage_x_GPS": 5.65029996,
    "geocodage_y_GPS": 46.25760162
  },
  {
    "service": "Commissariat de police de Bourg en Bresse",
    "adresse_geographique": "4 Rue des Remparts$01000 BOURG EN BRESSE",
    "telephone": "+33 4 74 47 20 20",
    "departement": "01",
    "code_commune_insee": "01053",
    "voie": "4 Rue des Remparts",
    "code_postal": "01000",
    "commune": "BOURG EN BRESSE",
    "geocodage_epsg": "",
    "geocodage_x": "",
    "geocodage_y": "",
    "geocodage_x_GPS": 5.22517643,
    "geocodage_y_GPS": 46.20676468
  }
]

J’ai du le retravailler car il ne ressort pas très bien, mais cela à l’air de fonctionner, j’arrive à récupérer la longitude et latitude en Double, il faut que je vérifie cela quand même.
Sauf que j’aimerai quand même réussir à travailler directement avec mon fichier CSV (ne serait ce que pour comprendre :sweat_smile:)

Désolé j’ai lu en diagonale et j’ai fait des suppositions alors que tu avais clairement parlé de CSV :person_facepalming:

Donc si je comprends bien tu arrives bien à lire les infos de chaque ligne depuis ton CSV sauf que la longitude et latitude ne sont pas correctement converties vers des Double quand tu passes par exemple Double("5.22517643") tu obtiens nil en résultat.
Ca me paraît étrange comme comportement :thinking:

Peut être que sur un système français, il faut utiliser la virgule et non le point comme séparateur. Juste pour tester, essaie de remplacer les points par des virgules dans ton CSV au niveau des geolocs et relance ton import avec ces nouvelles valeurs.

Si ça corrige le problème, il te faudra modifier ton code swift pour ne pas avoir à modifier tes CSV à chaque fois.

Je vais essayer ca dès que j’ai un moment pour modifier mon csv.
Pour le moment j’avance avec mon Json, mais qui ne sera pas viable sur le long terme car il ne se mettra pas à jour automatiquement.
Et si ca vient de cela je n’y aurai jamais pensé :sweat_smile:.
Je ferai un retour après avoir testé.

C’est vraiment possible que le soucis vienne de là :grin: