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

OpenOffice & LibreOffice Discussion :

Importer fichier .csv dans une table LO Base


Sujet :

OpenOffice & LibreOffice

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité de l' industrie
    Inscrit en
    mars 2010
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Retraité de l' industrie
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2010
    Messages : 162
    Points : 92
    Points
    92
    Par défaut Importer fichier .csv dans une table LO Base
    Bonjour,

    Je cherche depuis un moment à importer un fichier.csv dans une table de libreOffice Base. Je ne trouve aucun exemple mais peut-être ai-je mal cherché.
    Auriez vous une idée pour réaliser cette opération avec une macro?

    Cordialement

    PS; Je travaille avec LO 6.2. La base est sous Firebird

  2. #2
    Membre confirmé
    Homme Profil pro
    utilisateur
    Inscrit en
    janvier 2017
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : utilisateur
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2017
    Messages : 386
    Points : 612
    Points
    612
    Par défaut
    Bonjour El Bosc,

    Je ne vous serais pas d'un grand secours, vous avez surement déjà tenté ce que je vous propose

    Editer votre table LO Base dans Calc pour la modifier du contenu du fichier CSV, puis reconnecter le fichier obtenu à Base.
    LibreOffice (fr_YT): 6.2.8.2 (20/10/2019)
    OS : Windows 10.0

  3. #3
    Membre régulier
    Homme Profil pro
    Retraité de l' industrie
    Inscrit en
    mars 2010
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Retraité de l' industrie
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2010
    Messages : 162
    Points : 92
    Points
    92
    Par défaut Macro importation fichier.csv
    Bonjour,

    Merci de l' intèrêt que vous portez à ce sujet. J' ai trouvé un début de solution qui fonctionne parfaitement sous Base HSQL. Malheureusement, j' ai démarré sous Base Firebird. Je ne sais pas si le problème provient de cette différence mais il subsiste une difficulté. La ligne provoque l' erreur ci-dessous:
    Une exception c' est produite:
    Type: com.sun.star.sdbc.SQL.Exception
    Message: Erreur de séquence de fonction.
    Je vous joins le code de la macro:
    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
        Dim maConnexion as Object, oConnexion as Object, oForm As Object
    
        Sub AjoutDonnees
           Dim DrvMan As Object, maRequete as Object, Coding as Object
           Dim cheminCSV As String, URLbdcsv As String, instrSQL as String
           Dim Infos(3) As New com.sun.star.beans.PropertyValue
           Dim x As Long         '***
           Dim sNomFichier As String '***
           Dim lsNomFichier As Integer '***
    
           ThisDatabaseDocument.CurrentController.connect("","")
           maConnexion = ThisDatabasedocument.CurrentController.ActiveConnection
           DrvMan = CreateUnoService("com.sun.star.sdbc.DriverManager")
           Coding = CreateUnoService("com.sun.star.sdbc.FLATConnectionProperties")
           cheminCSV = "/home/elfouste/Documents/Python/Svg_Csv/DnExif.csv"
    
           ' extraction du nom de fichier sélectionné '***
           sNomFichier = cheminCSV
           lsNomFichier = len(sNomFichier)
           x = lsNomFichier
           while mid(sNomFichier,x,1) <> "/"
              x = x-1
           wend
           sNomFichier = mid(sNomFichier,x + 1,lsNomFichier-x-4)
           
           URLbdcsv = "sdbc:flat:" & cheminCSV
           Infos(0).Name = "HeaderLine"
           Infos(0).Value = True
           Infos(1).Name = "FieldDelimiter"
           Infos(1).Value = chr(44)
           Infos(2).Name = "StringDelimiter"
           Infos(2).Value = ","
           Infos(3).Name = "Extension"
           Infos(3).Value = "csv"
           
           oConnexion = DrvMan.getConnectionWithInfo(URLbdcsv, Infos())
           maRequete = maConnexion.createStatement()
           oForm = thisComponent
           instrSQL = "DELETE FROM ""Tp_Pht"""
           maRequete.executeUpdate(instrSQL)
           CopierDonnees(sNomFichier)
           
        End Sub
        '========================================================================================================
        Sub CopierDonnees(NomFichier)
    
           On Error GoTo CopierDonnees_Err
    
           Dim unRowSet as Object, maRequete as Object, resuQuery as Object, maRequete2 as object, Resultat as Object
           Dim Fenetre as Object, FenetreForm as Object, avance as Object
           Dim instrSQL as String, instrSQL2 as String, i as Integer, dteNaiss as Date, Compte as Integer, x as Integer
           
           Fenetre = ThisDatabaseDocument.CurrentController.Frame.ContainerWindow
           FenetreForm = oForm.currentcontroller.Frame.ContainerWindow
           Fenetre.Enable = False
           FenetreForm.Enable = False
           avance = oForm.CurrentController.StatusIndicator
           unRowSet = createUnoService("com.sun.star.sdb.RowSet")
           
           instrSQL = "SELECT * FROM " & NomFichier
           instrSQL2 = "SELECT COUNT(*) as ""nb"" FROM " &  NomFichier   
    
           maRequete = oConnexion.createStatement()
           maRequete2 = oConnexion.createStatement()
           Resultat = maRequete2.executeQuery(instrSQL2)
           Resultat.Next
           Compte = resultat.getInt(1)
           resuQuery = maRequete.executeQuery(instrSQL)
           
           With unRowSet
              .ActiveConnection = maConnexion
              .CommandType = com.sun.star.sdb.CommandType.TABLE
              .Command = "Tp_Pht"
              .Execute
              x = 1
              avance.start("Veuillez patienter ...", Compte)
              Do While resuQuery.Next
                 .moveToInsertRow
                 For i = 1 to 17
                    Select Case .Columns.getByIndex(i -1).TypeName
                       Case "INTEGER"
                          .Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))
                       Case "VARCHAR"
                          .Columns.getByIndex(i -1).updateString(resuQuery.getString(i))
                       Case "NUMERIC"
                          .Columns.getByIndex(i -1).updateInt(resuQuery.getInt(i))               
                    End Select
                       If i = 1 Then
                          .insertRow
                          Else
                             .UpdateRow
                       End If   
                 Next i
                 avance.Value = x
                 avance.Text = "Ligne " & x & " recopiée"
                 x = x + 1               
              Loop
                avance.Text = "Terminé " & Compte & " lignes recopiées"
           End With
           oConnexion.Dispose
           unRowSet.Dispose
           Wait 800
           avance.End
           FenetreForm.Enable = True
           Fenetre.Enable = True 
           CopierDonnees_Exit:   
              On Error GoTo 0
                 Exit Sub
           CopierDonnees_Err:
           MsgBox(Error, 16)
           FenetreForm.Enable = True
           Fenetre.Enable = True
           oConnexion.Dispose
           unRowSet.Dispose
           Resume CopierDonnees_Exit     
        End Sub
    Si vous voulez faire un essai, je joins un fichier csv et une ébauche de base de données

    Cordialement
    Fichiers attachés Fichiers attachés

  4. #4
    Membre confirmé
    Homme Profil pro
    utilisateur
    Inscrit en
    janvier 2017
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : utilisateur
    Secteur : Service public

    Informations forums :
    Inscription : janvier 2017
    Messages : 386
    Points : 612
    Points
    612
    Par défaut
    Bonsoir El Bosc,

    Je n'y connais rien, mais d'après ce que je crois comprendre, vous identifiez vos colonnes avec le même identifiant que la ligne à insérer "i", c'est une origine possible au pb...
    Je serais une machine logique, je buguerais...
    LibreOffice (fr_YT): 6.2.8.2 (20/10/2019)
    OS : Windows 10.0

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité de l' industrie
    Inscrit en
    mars 2010
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Retraité de l' industrie
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2010
    Messages : 162
    Points : 92
    Points
    92
    Par défaut Connaitre le résultat d' une requête
    Bonsoir njhub,

    Sur le principe, vous avez raison. Malgré tout j' ai effectué des tests avec une base LO sous HSQL et elle fonctionne parfaitement. La macro etait identique à la base sous Firebird et le fichier csv est le même dans les deux cas.
    En fait, la boucle sélectionne les données les une dernières les autres et si i = 1, le champ se trouve documenté.
    En Hsql, la boucle tourne 17 fois car il ya 17 champs à remplir. En Firebird, le système plante à la première boucle. Aussi, pour comprendre ce qu' il se passe sous Firebord, je voudrai savoir ce que contient le resuQuery qui est à l' origine de la boucle.

    Bonne soirée

  6. #6
    Membre régulier
    Homme Profil pro
    Retraité de l' industrie
    Inscrit en
    mars 2010
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Retraité de l' industrie
    Secteur : Industrie

    Informations forums :
    Inscription : mars 2010
    Messages : 162
    Points : 92
    Points
    92
    Par défaut Bogue Libre Office Base Firebird
    Bonsoir,

    Visiblement, c' est un bogue du au changement de HSQL en Firebird. Donc, en attendant mieux(Message demandant de passer à Firebird), je suis retourné sous HSQL. Voir le rapport de bogue https://bugs.documentfoundation.org/....cgi?id=118094.

    Cordialement

Discussions similaires

  1. [AC-2003] Importer fichier csv dans une table
    Par baryonyx dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/05/2013, 11h15
  2. Réponses: 7
    Dernier message: 29/09/2008, 16h44
  3. Importer un fichier csv dans une table mdb
    Par pobrouwers dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 02/12/2007, 15h17
  4. Importer un fichier CSV dans une table mySQL
    Par crazydiver_e2 dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/01/2007, 11h47
  5. Impossible d'importer un fichier csv dans une table sous MySQL
    Par manue85 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 20/04/2006, 13h06

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