IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

PERL et fichiers DBF


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut PERL et fichiers DBF
    Bonjour à tous,

    Toujours aussi peu expérimenté en PERL , je reviens vous demander de l'aide pour traiter des fichiers DBF.

    J'ai un certain nombre de fichiers DBF avec des noms et surtout des structures diverses. Ils ont cependant des points communs sur lesquels je veux m'appuyer :
    - leur nom est correct
    - ils ne comportent qu'un seul enregistrement (mais avec un nombre de champs variables dont les valeurs nous intéressent pas)

    Pour obtenir des fichiers uniformes, je cherche à :
    - conserver mon nom de fichier DBF
    - n'avoir plus qu'un seul champ (qu'on pourrait appeler "CODE") dans lequel on injecterait le nom du fichier sans l'extension (dans l'unique enregistrement).

    L'idée serait de d'exécuter un programme PERL à appliquer sur un dossier contenant mes fichiers DBF.

    En PJ un zip avec dans le dossier "entrée" le DBF d'entrée et dans le dossier "sortie" le DBF de sortie souhaité.

    Merci d'avance pour votre aide !

    Max
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip DBF.zip (686 octets, 42 affichages)

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Hum, pas bien compris. C'est quoi un fichier DBF?

    Tes fichiers joints sont apparemment binaires, je ne peux rien faire avec.

    Ne peux-tu pas les afficher normalement dans le post?

  3. #3
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    Citation Envoyé par Lolo78
    Hum, pas bien compris. C'est quoi un fichier DBF?
    Un .dbf est un fichier base de données. C'est le fichier que l'on trouve tel quel sur le disque, sa structure est spécifique au SGBD utilsé dBASE, Oracle...

    @max76
    Il semble que les modules CAM::DBF, XBase... permettent d'y accéder. Perso je ne les ai jamais utilisés. Ils ne permettent pas d'écrire selon une structure DBF.

    Pour travailler une structure DBF il est plus logique d'utiliser le module DBI, qui permet d'utiliser SQL et donc de tout faire dans la base : Créer un nouveau fichier .dbf, y créer une nouvelle table dans laquelle tu pourras structurer le nouvel enregistrement comme tu le désires.
    Un bon point de départ le tuto avec des exemples MySQL et Oracle.
    Note bien qu'on ne travaille pas directement sur le fichier .dbf, mais sur la base !
    Autrement dit, si tu n'as pas la base en ligne ce n'est pas la bonne solution...

    [EDIT 05:47] Dis-nous pourquoi tu désires accéder directement au fichier .dbf, ça nous aidera à comprendre ta problématique...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Bonjour,

    Les fichiers DBF ont aussi un autre usage : ils sont présent dans un des formats de données SIG (système d'information géographique) les plus utilisés, les shapefiles (créés par ESRI). Il s'agit d'un triplet de fichiers SHP (qui contient les "dessins") + DBF (qui contient les attributs txt et numériques relatifs à chaque dessin : exemple nom du projet, superficie, numéro du projet, responsable du projet...) + SHX (qui fait le lien entre le SHP et le DBF).
    Ce que je trouve pratique dans cette conception c'est que l'on peut "triturer" le fichier DBF séparément du reste des données.
    Les shapefiles sont capables de comporter un grand nombre d'objets géographiques avec beaucoup de champs associés, mais dans mon cas ils sont petits (mes SHP ne comportent qu'un dessin chacun) mais nombreux.
    Ma problématique : dans un premier temps je suis en train de structurer mes objets géographiques (en gros je m'occupe seulement de la qualité de mes SHP) les DBF associés, qui comportent des données très hétérogènes tant dans leurs valeurs que dans leur nom et nombre de champs (cela dépend de l'origine des fichiers et elles sont très diverses !), sont laissés tels quels.
    Je voudrais simplement, une fois que je suis satisfait de mes SHP, générer pour chacun d'eux un nouveau DBF avec un seul attribut : le nom du projet (qui est le nom du fichier sans l'extension) et écraser les anciens DBF. J'imaginais que l'on pouvait faire ça facilement en PERL, mais a priori, je me trompe...
    Ensuite une fois que mes projets (mes triplets SHP,SHX,DBF) sont tous bien structurés de la même manière, je pourrai enfin les fusionner avec une appli SIG :-)

    Merci de m'avoir lu jusqu'au bout !

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par dmganges Voir le message
    Un .dbf est un fichier base de données.
    A vrai dire, je me doutais bien que c'était quelque chose comme ça dont voulais parler max76, mais...
    Citation Envoyé par dmganges Voir le message
    C'est le fichier que l'on trouve tel quel sur le disque, sa structure est spécifique au SGBD utilsé dBASE, Oracle...
    ... mais c'est bien ça le problème: si c'est bien ce dont parle max76, ce n'est pas un format spécifique, et on ne peut alors rien dire de général sur la façon d'y accéder. Et, d'ailleurs, il est peu probable qu'il soit souhaitable de hacker ce genre de fichier, même en simple lecture et encore moins en écriture. Sauf à la rigueur dans les cas éventuels où la structure détaillée est publique, documentée et garantie. Publique et documentée, ce doit pouvoir être à peu près le cas au moins dans les projets de SGDB open source, mais garantie (c'est-à-dire pérenne, non susceptible d'évoluer au gré des versions du SGDB), c'est bien moins sûr, sauf peut-être si ce format est lui-même devenu une norme.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    La structure du DBF est standard (et pourrait être une version éprouvée comme du DBASE III).
    Je ne m'y connais pas beaucoup (du coup je vais peut-être dire des bêtises) mais un moyen de modifier le DBF ne pourrait peut-être de le travailler en hexadécimal ?

  7. #7
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Citation Envoyé par max76
    Les fichiers DBF ont aussi un autre usage : ils sont présent dans un des formats de données SIG (système d'information géographique) les plus utilisés, les shapefiles (créés par ESRI).
    ...
    MERCI pour tous ces détails !

    Je ne connais rien aux SIG, je ne te serai pas d'un grand secours :(

    Citation Envoyé par Lolo78
    ... mais c'est bien ça le problème: si c'est bien ce dont parle max76, ce n'est pas un format spécifique, et on ne peut alors rien dire de général sur la façon d'y accéder. Et, d'ailleurs, il est peu probable qu'il soit souhaitable de hacker ce genre de fichier, même en simple lecture et encore moins en écriture. Sauf à la rigueur dans les cas éventuels où la structure détaillée est publique, documentée et garantie. Publique et documentée, ce doit pouvoir être à peu près le cas au moins dans les projets de SGDB open source, mais garantie (c'est-à-dire pérenne, non susceptible d'évoluer au gré des versions du SGDB), c'est bien moins sûr, sauf peut-être si ce format est lui-même devenu une norme.
    Oui, je ne me risquerai pas à les modifier en dehors de l'outil qui les gèrent...

    @max76
    A tout hasard, et en tenant compte de la remarque de Lolo78, as-tu essayé de les ouvrir avec CAM::DBF, XBase... lire qq enreg pour voir ???

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par max76 Voir le message
    La structure du DBF est standard (et pourrait être une version éprouvée comme du DBASE III).
    Citation Envoyé par dmganges Voir le message
    A tout hasard, et en tenant compte de la remarque de Lolo78, as-tu essayé de les ouvrir avec CAM::DBF, XBase...
    Ce me semble être tout à fait pertinent :
    Voir CAM::DBF:
    Citation Envoyé par CAM::DBF
    CAM::DBF - Perl extension for reading and writing dBASE III DBF files
    SEE ALSO

    Please see the XBase modules on CPAN for more complete implementations of DBF file reading and writing. This module differs from those in that it is designed to be error-correcting for corrupted DBF files. If you already know how to use DBI, then DBD::XBase will likely make you happier than this module.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  9. #9
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par max76 Voir le message
    La structure du DBF est standard (et pourrait être une version éprouvée comme du DBASE III).
    Je ne m'y connais pas beaucoup (du coup je vais peut-être dire des bêtises) mais un moyen de modifier le DBF ne pourrait peut-être de le travailler en hexadécimal ?
    Hum, hexadécimal, ce n'est qu'une représentation pratique, mais rien n'empêche d'ouvrir un fichier binaire en Perl, encore faut-il savoir exactement que que l'on va y trouver, où, sous quel format, etc.

    EDIT: pendant que j'écrivais, Philou a posté une solution qui paraît très intéressante.

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Rendons à César ce qui appartient à César : la solution a été premièrement énoncé par dmganges
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  11. #11
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    César te remercie Philou67430
    Mais je ne revendique fermement que mes âneries qui, incontestablement, ne peuvent qu'être de MOI !
    Dès qu'il y a une parcelle de vérité ou de bon sens, j'en dois l'essentiel à des prédécesseurs Copernic, Ptolémée, Hipparque, Pythagore...
    Et pour être franc, je n'ai jamais eu a remonter si loin dans le temps pour savoir à qui je devais "MA" science

    Dans ce fil, n'ayant consulté la doc de CAM_DBF et XBase qu'en diagonale, et perplexe autant que Lolo78 quant à la pérennité de la solution j'ai écrit :
    Citation Envoyé par dmganges
    ... Ils ne permettent pas d'écrire selon une structure DBF.
    Celle-là je la revendique fermement

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Lolo78 Voir le message
    Hum, hexadécimal, ce n'est qu'une représentation pratique, mais rien n'empêche d'ouvrir un fichier binaire en Perl, encore faut-il savoir exactement que que l'on va y trouver, où, sous quel format, etc.
    Lolo78, la modification du fichier en binaire en Perl, cela me semble la solution !

    Ce que je souhaite, c'est pouvoir générer automatiquement autant de petits fichiers DBF (un champ, un enregistrement) que de fichiers SHP (ou SHX, qu'importe) : pour un fichier "nom_fichier".SHP, je voudrais qu'un fichier "nom_fichier".DBF soit créé et que dans l'unique cellule il y ait la valeur "nom_fichier" (= le nom du fichier sans l'extension).

    Pour info voici la structure en hexadécimal de mon fichier EP596.DBF (qui ne contient qu'une cellule avec la valeur EP596) :

    03 0f 0a 0c 01 00 00 00 41 00 06 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00
    43 4f 44 45 00 00 00 00 00 00 00 43 01 00 00 00
    05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0d 20 45 50 35 39 36

    les données en gras représentent la valeur de mon unique cellule : EP596


    Je souhaite que le code Perl, quand il rencontre un fichier EV453.SHP, me crée un fichier EV453.DBF en hexadécimal comme suit :

    03 0f 0a 0c 01 00 00 00 41 00 06 00 00 00 00 00
    00 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00
    43 4f 44 45 00 00 00 00 00 00 00 43 01 00 00 00
    05 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
    0d 20
    45 56 34 35 33

    les données en violet représentent la structure de mon DBF (= le tronc commun de tous mes fichiers DBF) et les données en gras représentent la partie variable = la valeur de mon unique cellule qui aura été récupérée depuis le nom du fichier SHP : EV453

    Je voudrais que un code Perl qui me crée pour chacun des SHP d'un dossier, un DBF selon ces règles.

    Désolé de ne pas avoir été assez clair dans ma demande initiale, j'espère que ce complément vous permet de voir plus précisément mon besoin.

  13. #13
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    A priori, ouvre un fichier existant ayant les données de préfixe voulues, récupère les x (66?) premiers octets (fonction read) et stocke cette chaîne binaire dans une variable. Ensuite, ouvre chacun de tes fichiers de sortie avec le filehandle en binmode (la format par défaut :raw devrait convenir, pas besoin de le spécifier), et écrit dans ton fichier cette variable suivie du nom de ton fichier (sans extension). Je pense que ça devrait marcher, mais il y a peut-être un ou deux points de détails à tester.

    Sinon, tu peux sans doute aussi coder en dur le préfixe en représentation hexa et utiliser la fonction pack pour en faire une variable au format binaire, qui tu utilises ensuite pour tous tes fichiers.

  14. #14
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci Lolo78 pour cette contribution qui me permettrait sûrement de faire un code efficace si je savais programmer en Perl... (mon coeur de métier c'est les SIG et BDD spatiales)
    Je sais un tout petit peu bidouiller un script Perl existant (et encore...) mais partir d'une page blanche, je n'en suis actuellement pas capable
    Si quelqu'un peut me mettre le pied à l'étrier en me fournissant un début de code...

    A vot' bon coeur !

  15. #15
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par dmganges Voir le message
    Dans ce fil, n'ayant consulté la doc de CAM_DBF et XBase qu'en diagonale, et perplexe autant que Lolo78 quant à la pérennité de la solution j'ai écrit ...
    Ce n'est pourtant pas ce que semble prétendre la documentation... mais visiblement, Max a trouvé une meilleur solution (ou une solution plus rapide ?)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  16. #16
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par max76 Voir le message
    Si quelqu'un peut me mettre le pied à l'étrier en me fournissant un début de code...

    Un petit test qui montre que la stratégie proposée semble marcher.

    Je lis le fichier EP596.dbf et récupère en mode binaire les 66 premiers octets (variable $prefix), puis ferme le fichier.

    Puis j'ouvre un nouveau fichier EP596_test.dbf, également en mode binaire. J'y imprime la variable préfix puis la chaîne de caractère "EP596" et ferme le fichier.

    Le fichier obtenu est identique au fichier d'origine, ce qui paraît prouver que ça marche comme espéré:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    use strict;
    use warnings;
     
    # recherche du préfixe à réutiliser (à faire une seule fois avec un fichier modèle en entrée)
    my $file_in = "EP596.dbf";
    open my $IN, "<", $file_in or die "Ouverture impossible de $file_in $!";
    binmode $IN;
    my $prefix;
    read $IN, $prefix, 66; # lecture des 66 premiers octets (en binaire)
    close $IN;
     
    # fichier en sortie (la suite à faire pour chaque fichier en sortie, avec une variable $file_num différente à chaque fois
    my $file_num = "EP596"; # variable pour l'exemple
    my $file_out = "EP596_test.dbf";
    open my $OUT, ">", $file_out or die "Ouverture impossible de $file_out $!";
    binmode $OUT;
    print $OUT "$prefix$file_num";
    close $OUT;
    Voilà, tu n'as plus qu'à adapter.

    PS: ci-joint le fichier origine et le fichier produit zippés.
    Fichiers attachés Fichiers attachés

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2012
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci encore Lolo78 (ça n'est pas la première fois que tu me tires d'affaire !)

    J'ai pu faire exactement ce que je voulais à partir de ton code, merci de m'avoir mis le pied à l'étrier !!!

    Je poste l'intégralité du code que j'ai produit avec mes commentaires (je ne le prendrai pas mal si quelqu'un me dit qu'on peut encore simplifier, je suis là aussi pour apprendre à faire propre ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    use strict;
    use warnings;
     
    # recherche du préfixe (= tronc commun de mon DBF) à réutiliser (à faire une seule fois avec un fichier modèle en entrée)
    my $file_in = "C:/Temp/shapes/model/EP596.dbf";
    open my $IN, "<", $file_in or die "Ouverture impossible de $file_in $!";
    binmode $IN;
    my $prefix;
    read $IN, $prefix, 66; # lecture des 66 premiers octets (en binaire)
    close $IN;
    # on a donc récupéré la partie fixe du DBF et on cherche à ajouter pour chaque fichier rencontré, la partie variable (=suffixe) en binaire et enregistrer le fichier DBF avec le nom correspondant au SHP rencontré
    # on va donc boucler sur les fichiers SHP d'un dossier particulier pour générer les DBF correspondants
    my @files = <C:/Temp/shapes/*.shp>;
     foreach my $file (@files) { (my $name = $file ) =~ s{.*/}{}; #on retire le chemin
     (my $without_extension = $name) =~ s/\.[^.]+$//; #on retire l'extension
      my $file_out = $without_extension . ".dbf"; #on génère le nom du fichier DBF (identique à celui du SHP sinon ils ne pourront pas être ouverts par le SIG)
      (my $code_conv = $without_extension) =~ s/\_.*//; #ici je ne sélectionne que la partie située avant l'éventuel "_" de mon fichier (ex: "EP27_line" me donne "EP27")
       my $sufix = $code_conv . (" " x (5 - length($code_conv))); #on génère le suffixe à introduire dans le DBF (la structure du modèle DBF attend 5 caractères, il faut impérativement ajouter des espaces à la fin des valeurs < 5 caractères, sinon le DBF généré sera corrompu)
    open my $OUT, ">", $file_out or die "Ouverture impossible de $file_out $!"; #on crée et ouvre le fichier DBF avec le nom qu'on a généré
    binmode $OUT;
    print $OUT "$prefix$sufix"; #on concatène préfixe et suffixe dans le fichier que l'on vient d'ouvrir
    close $OUT;
    }
    Encore une fois, je me prosterne devant la puissance de Perl (j'étais quand même convaincu que c'était possible de faire ça avec Perl, sinon je n'aurais pas demandé de l'aide ici...)

  18. #18
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Pour normaliser la longueur de ton suffixe, la fonction sprintf est sans doute plus adaptée. Exemple sous le débogueur Perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      DB<1> $f = "toto";
     
      DB<2>  $f = sprintf "%-5s", $f;
     
      DB<3> print "<$f>";
    <toto >
      DB<4>

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Importer un fichier dbf
    Par podz dans le forum Access
    Réponses: 13
    Dernier message: 19/12/2006, 19h29
  2. [Jdbc] Lecture fichier DBF via JDBC
    Par djidji dans le forum JDBC
    Réponses: 4
    Dernier message: 06/09/2005, 14h14
  3. remplacer fichier DBF
    Par jeff06_2 dans le forum Bases de données
    Réponses: 3
    Dernier message: 14/01/2005, 09h05
  4. [Oracle/Admin] chg de repertoire fichiers dbf (suite)
    Par shaun_the_sheep dans le forum Administration
    Réponses: 20
    Dernier message: 03/11/2004, 15h03
  5. Lecture d'un fichier .dbf
    Par San Soussy dans le forum Autres SGBD
    Réponses: 8
    Dernier message: 07/07/2004, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo