Aller au contenu

Importer un fichier CSV sous Map


Messages recommandés

Posté(e)

Bonjour,

 

Je vais partager une routine lisp que j'ai conçue pour l'import de points à partir d'un fichier CSV.

Je poste ici, car c'est plutôt destiné à Autocad Map, peut être que ça peut fonctionner sous une version classique... (pas testé)

 

Celle ci permet de générer les points géolocalisés avec:

- Soit constitution automatique des Données d'objet pour les points

- Soit écritures automatique de données sous formes de texte.

- Soit les deux formes (Textes et OD)

- Soit Aucun; juste les points...

 

Je vous joins un fichier CSV tiré depuis Data.gouv.fr pour tester la routine et voir ainsi la structure souhaitée du fichier CSV.

Pour un bon import il est souhaitable d'avoir une première ligne d'intitulé et au minimum les données X et Y en nombres réels. L'agencement de l'ordre des colonnes de données dans le fichier CSV n'a pas d'importance, il suffit de répondre correctement au question posées par la routine (Caractère, Entier, Réel , X, Y)

 

Voilà, si ça peut faire le bonheur d'utilisateurs!

 

Le code

(defun translate_str (word / nw_str)
 (foreach el (mapcar '(lambda (str) (vl-string->list str)) word) (setq nw_str (cons (subst 95 32 el) nw_str)))
 (reverse (mapcar '(lambda (str) (vl-list->string str)) nw_str))
)
(defun c:readCSV ( / input f_open key l_read make_value flag lay_nam ht_txt n i l_od table_def x_data y_data new_pt data_str name_lay e_last field_od typ_od od_data )
 (setq
   input (getfiled "Sélectionner un fichier CSV" "" "csv" 2)
   f_open (open input "r")
   key nil
 )
 (while (setq l_read (read-line f_open))
   (if (not key)
     (progn
       (if (not (tblsearch "LAYER" (vl-filename-base input)))
         (entmake
           (list
             (cons 0  "LAYER")
             (cons 100 "AcDbSymbolTableRecord")
             (cons 100 "AcDbLayerTableRecord")
             (cons 2 (vl-filename-base input))
             (cons 70 0)
             (cons 62 1)
             (cons 370 -3)
             (cons 6 "Continuous")
           )
         )
       )
       (print l_read)
       (initget "Oui Non")
       (if (eq (getkword "\nConstituer intitulé de calques ou OD avec la 1ère ligne? [Oui/Non] <N>: ") "Oui")
         (progn
           (initget "OD Texte Deux Aucun")
           (setq make_value (getkword "\nInscrire les valeurs en tant que [OD/Texte/Deux/Aucun]? <Deux>: ") flag T)
           (if (not make_value) (setq make_value "Deux"))
           (while (/= (substr l_read 1 (vl-string-position 59 l_read)) "")
             (setq lay_nam (cons (substr l_read 1 (vl-string-position 59 l_read)) lay_nam))
             (if (not (tblsearch "LAYER" (substr l_read 1 (vl-string-position 59 l_read))))
               (if (or (eq make_value "Deux") (eq make_value "Texte"))
                 (entmake
                   (list
                     (cons 0  "LAYER")
                     (cons 100 "AcDbSymbolTableRecord")
                     (cons 100 "AcDbLayerTableRecord")
                     (cons 2 (substr l_read 1 (vl-string-position 59 l_read)))
                     (cons 70 0)
                     (cons 62 7)
                     (cons 370 -3)
                     (cons 6 "Continuous")
                   )
                 )
               )
             )
             (if (vl-string-position 59 l_read)
               (setq l_read (substr l_read (+ 2 (vl-string-position 59 l_read))))
               (setq l_read "")
             )
           )
           (setq
             l_read (read-line f_open)
             ht_txt (getdist (getvar "VIEWCTR") (strcat "\nHauteur du texte <" (rtos (getvar "TEXTSIZE") 2) ">"))
             lay_nam (reverse lay_nam)
           )
           (if ht_txt (setvar "TEXTSIZE" ht_txt))
         )
         (setq flag nil)
       )
     )
   )
   (setq n 0 i 0)
   (while (vl-string-position 59 l_read)
     (if (not (zerop n)) (setq l_read (substr l_read (+ 2 (vl-string-position 59 l_read)))))
     (set (read (strcat "data_" (itoa (setq n (1+ n))))) (substr l_read 1 (vl-string-position 59 l_read)))
   )
   (if (not key)
     (progn
       (repeat n
         (princ (strcat "\"" (strcat "data_" (itoa (setq i (1+ i))) " = " (eval (read (strcat "data_" (itoa i)))))))
         (initget 1 "Entier Reel Chaine")
         (setq key (getkword "\nLa donnée est un [Entier/Reel/Chaine]?: "))
         (cond
           ((eq key "Entier")
             (set (read (strcat "typ_" (itoa i))) (cons 'INT 0))
             (setq l_od (cons "Integer" l_od))
           )
           ((eq key "Reel")
             (initget "X Y Autre")
             (setq key (getkword "\nValeur de la donnée [X/Y/Autre]? <Autre>: "))
             (cond 
               ((eq key "X") (set (read (strcat "typ_" (itoa i))) (cons 'REAL 1)))
               ((eq key "Y") (set (read (strcat "typ_" (itoa i))) (cons 'REAL 2)))
               (T (set (read (strcat "typ_" (itoa i))) (cons 'REAL 0)))
             )
             (setq l_od (cons "Real" l_od))
           )
           ((eq key "Chaine")
             (set (read (strcat "typ_" (itoa i))) (cons 'STR 0))
             (setq l_od (cons "Character" l_od))
           )
         )
       )
       (setq
         l_od (reverse l_od)
         table_def (car (translate_str (list (vl-filename-base input))))
       )
       (if (and flag (not (member table_def (ade_odtablelist))))
         (ade_oddefinetab 
           (list
             (cons "Tablename" table_def)
             '("TableDesc" . "")
             (append '("Columns")
               (mapcar
                 '(lambda (x y)
                   (list
                     (cons "ColName" x)
                     '("ColDesc" . "")
                     (cons "ColType" y)
                     (cond
                       ((eq y "Character") (cons "DefaultVal" ""))
                       ((eq y "Integer") (cons "DefaultVal" 0))
                       ((eq y "Real") (cons "DefaultVal" 0.0))
                     )
                   )
                 )
                 (translate_str lay_nam)
                 l_od
               )
             )
           )
         )
       )
     )
   )
   (setq i 0)
   (repeat n
     (cond
       ((eq (car (eval (read (strcat "typ_" (itoa (setq i (1+ i))))))) 'REAL)
         (cond
           ((eq (cdr (eval (read (strcat "typ_" (itoa i))))) 1)
             (setq x_data (atof (eval (read (strcat "data_" (itoa i))))))
           )
           ((eq (cdr (eval (read (strcat "typ_" (itoa i))))) 2)
             (setq y_data (atof (eval (read (strcat "data_" (itoa i))))))
           )
         )
       )
     )
   )
   (cond
     ((and x_data y_data)
       (setq new_pt (list x_data y_data) i 0 name_lay lay_nam)
       (entmake
         (list
           '(0 . "POINT")
           '(100 . "AcDbEntity")
           (cons 8 (vl-filename-base input))
           (cons 10 new_pt)
           '(210 0.0 0.0 1.0)
           '(50 . 0.0)
         )
       )
       (setq e_last (entlast) field_od (translate_str lay_nam)  typ_od l_od)
       (repeat n
         (setq data_str (eval (read (strcat "data_" (itoa (setq i (1+ i)))))))
         (if data_str
           (progn
             (setq od_data
               (cond
                 ((eq (car typ_od) "Character") data_str)
                 ((eq (car typ_od) "Integer") (atoi (if (eq data_str "") "0" data_str)))
                 ((eq (car typ_od) "Real") (atof (if (eq data_str "") "0.0" data_str)))
               )
             )
             (if (and flag (or (eq make_value "Deux") (eq make_value "OD")))
               (progn
                 (ade_odaddrecord e_last table_def)
                 (ade_odsetfield
                   e_last
                   table_def
                   (car field_od)
                   0
                   od_data
                 )
               )
             )
             (if (or (eq make_value "Deux") (eq make_value "Texte"))
               (progn
                 (entmake
                   (list
                     '(0 . "TEXT")
                     '(100 . "AcDbEntity")
                     (cons 8 (car name_lay))
                     (cons 10 new_pt)
                     (cons 40 (getvar "TEXTSIZE"))
                     (cons 1 data_str)
                     '(50 . 0.0)
                     '(41 . 1.0)
                     '(51 . 0.0)
                     '(7 . "Standard")
                     '(71 . 0)
                     '(72 . 0)
                     '(11 0.0 0.0 0.0)
                     '(210 0.0 0.0 1.0)
                     '(100 . "AcDbText")
                     '(73 . 0)
                   )
                 )
               )
             )
             (setq
               new_pt (polar new_pt (* 1.5 pi) (* 1.5 (getvar "TEXTSIZE")))
               name_lay (cdr name_lay)
               typ_od (cdr typ_od)
               field_od (cdr field_od)
             )
           )
           (setq
             name_lay (cdr name_lay)
             typ_od (cdr typ_od)
             field_od (cdr field_od)
           )
         )
       )
     )
   )
 )
 (close f_open)
 (setq i 0)
 (repeat n
   (set (read (strcat "typ_" (itoa (setq i (1+ i))))) nil)
   (set (read (strcat "data_" (itoa i))) nil)
 )
 (prin1)
)

Supports_Cartoradio.zip

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)
Pour ceux qui n'ont pas toujours covadis sous la main, ça va tirer une belle épine du pied.

Je pense qu'il y a mieux pour faire des imports de points même sans Covadis.

 

L’intérêt ici est surtout pour MAP.

Voici par exemple un autre exemple tiré de data.gouv.fr, il concerne les bornes de rechargement pour les véhicules électriques sur la France entière.

Je vous cache pas que j'ai eu besoin de retoucher le CSV téléchargé:

*convertir le séparateur de "," à ,";" (ils ont la bonne idée d'utiliser la virgule dans leur cellules)

*supprimer les retour de ligne présent dans certaines cellules...

*supprimer la colonne sans intitulé (ou alors rajouter un intitulé)

 

Le résultat sera dans un système de projection "WGS84", système à attribuer au dessin si l'on veut le reprojeter dans un autre système.

 

Voici l'extrait de l'import complet (notez bien que la latitude est le Y et la longitude le X) avec le fichier joint pour obtenir les textes et les Données d'Objets.

Commande: READCSV

 

"ID_station;nom_station;adresse_station;latitude;longitude;nom_porteur;type_charge;nbre_pdc;type_connecteur;date_maj;observations;source"

Constituer intitulé de calques ou OD avec la 1ère ligne? [Oui/Non] <N>: O

 

Inscrire les valeurs en tant que [OD/Texte/Deux/Aucun]? <Deux>:

 

Hauteur du texte <0.2000>.001

"data_1 = FR*SEO*PAB79005P0027A

La donnée est un [Entier/Reel/Chaine]?: C

"data_2 = Réseau Alterbase - Airvault - Pl du Cygne

La donnée est un [Entier/Reel/Chaine]?: C

"data_3 = Place du Cygne - 79600 AIRVAULT

La donnée est un [Entier/Reel/Chaine]?: C

"data_4 = 46.825164

La donnée est un [Entier/Reel/Chaine]?: R

 

Valeur de la donnée [X/Y/Autre]? <Autre>: Y

"data_5 = -0.142448

La donnée est un [Entier/Reel/Chaine]?: R

 

Valeur de la donnée [X/Y/Autre]? <Autre>: X

"data_6 = SEOLIS

La donnée est un [Entier/Reel/Chaine]?: C

"data_7 = accélérée

La donnée est un [Entier/Reel/Chaine]?: C

"data_8 = 2

La donnée est un [Entier/Reel/Chaine]?: E

"data_9 = T E/F-T2-T3

La donnée est un [Entier/Reel/Chaine]?: C

"data_10 = 2015-05-10T00:00:00Z

La donnée est un [Entier/Reel/Chaine]?: C

"data_11 = www.alterbase.fr

La donnée est un [Entier/Reel/Chaine]?: C

"data_12 = Alterbase

La donnée est un [Entier/Reel/Chaine]?: C

 

NB:Autocad peut afficher qu'il ne répons pas, mais laissez faire (Ne tuez pas la tâche), pour moi une trentaine de secondes ont suffit pour faire l'import et qu'Autocad reprenne la main normalement.

IRVE-201605.zip

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité