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

Oracle Discussion :

[PL/SQL] lecture de csv, traitement et ecriture du résultat dans un fichier CSV


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut [PL/SQL] lecture de csv, traitement et ecriture du résultat dans un fichier CSV
    Bonjour tout le monde ,

    je suis débutant dans le monde de plsql , et je me trouve confrenté a une problématique qui est la suivante :

    1 - je doit récuperer des données d'un fichier CSV sous la forme suivante :

    ancien_nom_1;nouveau_nom_1
    ancien_nom_2;nouveau_nom_2
    ancien_nom_3;nouveau_nom_3
    .
    .
    .
    ancien_nom_n;nouveau_nom_n
    2 - je doit mettre à jours les anciens nom et les modifier par les nouveaux

    3 - je doit générer un fichier de sortie (CSV) sous la forme suivante :

    <ancien_nom>;<nouveau_nom>;<OK|KO>;<Motif de l'echec>

    exemple :

    ancien_nom_1;nouveau_nom_1;OK;
    ancien_nom_2;nouveau_nom_2;OK;
    ancien_nom_3;nouveau_nom_3;KO;nom inexistant
    .
    .
    .
    ancien_nom_n;nouveau_nom_n;KO;erreur chaine de caractère
    j'utilise Oracle 9i

    merci de votre aide

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tu devrais pouvoir t'en sortir avec le package UTL_FILE et un découpage de ta chaîne avec les fonctions SUBSTR et INSTR.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  3. #3
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    j'ai déja vu sur le forum des discutions qui parlaient de UTL_FILE , mais cela ne va concerner que le premier point de ma problématique .
    Ce qui m'agasse c'est surtout le fichier de sortie qui doit pour chaque ligne , preciser le résultat de la mise à jour

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Bah non, cela concerne aussi le fichier de sortie, sinon avec quoi veux-tu écrire dans un fichier ?

    Pour reprendre point par point :
    1. lecture du fichier avec utl_file et découpage de la chaîne avec INSTR et SUBSTR :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    utl_file.get_line (v_id_fic, v_ligne);
    v_ancien_nom := substr (v_ligne, 1, instr (v_ligne, ';') - 1);
    v_nouveau_nom := substr (v_ligne, instr (v_ligne, ';') + 1);
    2. Tu fais un update sur la table
    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
    begin
      update maTable
      set colNom = v_nouveau_nom
      where colNom = v_ancien_nom;
      if sql%notfound then
        v_resultat := 'KO';
        v_motif := 'Aucune ligne'; 
      else
        v_resultat := 'OK';
        v_motif := null;
      end if;
    exception
       when others then
           v_resultat := 'KO';
           v_motif := 'Erreur oracle ' || sqlcode;
    end;
    3. Tu écris dans un fichier de sortie avec UTL_FILE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    utl_file.put_line (v_id_sortie, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
                                    v_result || ';' || v_motif);
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Merci plaineR pour ta reponse si rapide , je vais tester tous ca et je vais repondre asap

  6. #6
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    voila le bout de code que j' ai developpé

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
     DECLARE
      -- resultat de l'update et motifs --
      v_resultat VARCHAR2(256);
      v_motif VARCHAR2(256);
      -- variable ancien_nom et nouveau_nom --
      v_ancien_nom VARCHAR2(6);
      v_nouveau_nom VARCHAR2(6);
      -- Noms des fichiers --
      v_fichier_in   VARCHAR2(128) := 'testin.csv' ;      
      v_fichier_out  VARCHAR2(128) := 'testout.csv' ;     
       -- Noms des répertoires --
      v_dir_in   VARCHAR(30)   := 'FICHIERS_IN';               
      v_dir_out  VARCHAR(30)   := 'FICHIERS_OUT' ;              
      -- Pointeurs de fichier --
      v_id_fic	UTL_FILE.FILE_TYPE ;
      v_id_sortie	UTL_FILE.FILE_TYPE ;
      -- Tampon de travail --  
      v_ligne	VARCHAR2(32767) ;  
      -- Message --
      LC$Msg    VARCHAR2(256) ;
      -- Exception --
     LE$Fin    EXCEPTION ;
     
    BEGIN
    				 -- Ouverture du fichier en entrée
    				  BEGIN
    				    v_id_fic := UTL_FILE.FOPEN(   v_dir_in, v_fichier_in, 'R', 32764 ) ;
    				  EXCEPTION
    				    WHEN OTHERS THEN
    					LC$Msg := SQLERRM || ' [' || v_dir_in || '] -> ' || v_fichier_in;
    					RAISE LE$Fin ;
    				  END ;
     
    				  -- Ouverture du fichier en sortie
    				  BEGIN
    				    v_id_sortie := UTL_FILE.FOPEN( v_dir_out, v_fichier_out, 'W', 32764 ) ;
    				  EXCEPTION
    				    WHEN OTHERS THEN
    					LC$Msg := SQLERRM || ' [' || v_dir_out || '] -> ' || v_fichier_out;
    					RAISE LE$Fin ;
    				  END ;	
     
     
    				BEGIN
     
    				LOOP utl_file.get_line (v_id_fic, v_ligne);
    				v_ancien_nom := SUBSTR (v_ligne, 1, INSTR (v_ligne, ';') - 1);
    				v_nouveau_nom := SUBSTR (v_ligne, INSTR (v_ligne, ';') + 1);
     
     
    				BEGIN
    				  UPDATE NOM
    				  SET NOM.ANCIEN_NOM = v_nouveau_nom
    				  WHERE NOM.ANCIEN_NOM = v_ancien_nom;
    				  IF SQL%NOTFOUND THEN
    				    v_resultat := 'KO';
    				    v_motif := 'Aucune ligne'; 
    				  ELSE
    				    v_resultat := 'OK';
    				    v_motif := NULL;
    				  END IF;
    				EXCEPTION
    				   WHEN OTHERS THEN
    				       v_resultat := 'KO';
    				       v_motif := 'Erreur oracle ' || SQLCODE;
    				END;
     
    				utl_file.put_line (v_id_sortie, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
    				                                v_resultat || ';' || v_motif);
     
    				END LOOP;
    				END;
     
    EXCEPTION
       WHEN LE$Fin THEN
         UTL_FILE.FCLOSE_ALL ;
         RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
    END ;
    mais j'ai une erreur qui me bloque :

    The following error has occurred:

    ORA-01403: Aucune donnée trouvée
    ORA-06512: à "SYS.UTL_FILE", ligne 18
    ORA-06512: à "SYS.UTL_FILE", ligne 610
    ORA-06512: à ligne 46
    la ligne 46 correspond a la ligne : utl_file.get_line (v_id_fic, v_ligne);

    qu est ce queje doit faire ?

  7. #7
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Cette exception se déclenche quand tu as lu toutes les lignes de ton fichier, il faut donc faire quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    loop
       begin
          -- lecture de la ligne du fichier
          utl_file.get_line (...);
          -- traitement de la ligne du fichier
          ...
       exception
            -- s'il n'y a plus de lignes a lire dans le fichier, je sors de ma boucle 
            when no_data_found then exit;
       end;
    end loop;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2005
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    merci plaineR, c'est de là d'ou vient l'erreur .
    je l'ai corrigé , je le joint ci dessous
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
     
     DECLARE
      -- resultat de l'update et motifs --
      v_resultat VARCHAR2(256);
      v_motif VARCHAR2(256);
      -- variable ancien_nom et nouveau_nom --
      v_ancien_nom VARCHAR2(15);
      v_nouveau_nom VARCHAR2(15);
      -- Noms des fichiers --
      v_fichier_in   VARCHAR2(128) := 'testin.csv' ;      -- a adapter sur votre configuration
      v_fichier_out  VARCHAR2(128) := 'testout.csv' ;      -- a adapter sur votre configuration
      -- Noms des répertoires --
      v_dir_in   VARCHAR(30)   := 'FICHIERS_IN';               -- a adapter sur votre configuration
      v_dir_out  VARCHAR(30)   := 'FICHIERS_OUT' ;              -- a adapter sur votre configuration
      -- Pointeurs de fichier --
      LF$FicIN	    UTL_FILE.FILE_TYPE ;
      LF$FicOUT	    UTL_FILE.FILE_TYPE ;
      -- Tampon de travail --  
      v_ligne	VARCHAR2(32767) ;  
      -- Message --
      LC$Msg    VARCHAR2(256) ;
      -- Exception --
     LE$Fin    EXCEPTION ;
     
    BEGIN
    				 -- Ouverture du fichier en entrée
    				  BEGIN
    				    LF$FicIN := UTL_FILE.FOPEN( v_dir_in, v_fichier_in, 'R', 32764 ) ;
    				  EXCEPTION
    				    WHEN OTHERS THEN
    					LC$Msg := SQLERRM || ' [' || v_dir_in || '] -> ' || v_fichier_in;
    					RAISE LE$Fin ;
    				  END ;
     
    				  -- Ouverture du fichier en sortie
    				  BEGIN
    				    LF$FicOUT := UTL_FILE.FOPEN( v_dir_out, v_fichier_out, 'W', 32764 ) ;
    				  EXCEPTION
    				    WHEN OTHERS THEN
    					LC$Msg := SQLERRM || ' [' || v_dir_out || '] -> ' || v_fichier_out;
    					RAISE LE$Fin ;
    				  END ;	
     
     
    				BEGIN
     
    				LOOP 
    				UTL_FILE.GET_LINE (LF$FicIN, v_ligne);
     
    				v_ancien_nom := SUBSTR (v_ligne, 1, INSTR (v_ligne, ';') - 1);
    				v_nouveau_nom := SUBSTR (v_ligne, INSTR (v_ligne, ';') + 1);
     
     
    				BEGIN
    				  UPDATE NOM
    				  SET NOM.ANCIEN_NOM = v_nouveau_nom
    				  WHERE NOM.ANCIEN_NOM = v_ancien_nom;
    				  IF SQL%NOTFOUND THEN
    				    v_resultat := 'KO';
    				    v_motif := 'Aucune ligne'; 
    				  ELSE
    				    v_resultat := 'OK';
    				    v_motif := NULL;
    				  END IF;
    				EXCEPTION
    				   WHEN OTHERS THEN
    				       v_resultat := 'KO';
    				       v_motif := 'Erreur oracle ' || SQLCODE;
    				END;
     
    				utl_file.put_line (LF$FicOUT, v_ancien_nom || ';' || v_nouveau_nom || ';' ||
    				                                v_resultat || ';' || v_motif);
     
    				END LOOP;
    				Exception
        			 When NO_DATA_FOUND Then -- Fin du fichier en entrée
    		        -- Fermeture des fichiers --
    				UTL_FILE.FCLOSE( LF$FicIN ) ;
    				UTL_FILE.FCLOSE( LF$FicOUT ) ;
     
    				END;
     
    EXCEPTION
       WHEN LE$Fin THEN
         UTL_FILE.FCLOSE_ALL ;
         RAISE_APPLICATION_ERROR( -20100, LC$Msg ) ;
    END ;

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

Discussions similaires

  1. [XL-2003] vba, stocker des résultats dans un fichier csv
    Par linann dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/06/2010, 21h17
  2. Réponses: 0
    Dernier message: 26/05/2009, 10h10
  3. exporter données sql dans un fichier csv en java
    Par pinkemma dans le forum JDBC
    Réponses: 2
    Dernier message: 07/03/2007, 09h23
  4. [CSV] Ajouter et supprimer des ligne dans un fichier CSV
    Par gpsevasion dans le forum Langage
    Réponses: 3
    Dernier message: 28/02/2007, 17h00
  5. [CSV] Ecriture des données dans un fichier
    Par kagura dans le forum Langage
    Réponses: 3
    Dernier message: 07/11/2006, 22h55

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