Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2394 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Extraire que certaines données d'un fichier csv

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Extraire que certaines données d'un fichier csv

n°1877173
Fouinette8​5
Posté le 24-04-2009 à 10:07:38  profilanswer
 

Bonjour je Forum,  
 
J'ai pu grâce au forum trouver comment extraire des infos d'un fichier csv, ça marche nikel mais sa reste pour moi un vrai charabiat du coup je n'arrive pas à adapter le code afin de n'extraire que certaine colonne.  
Mon fichier csv contient en effet une trentaine de colonnes mais j'ai besoin de récupérer que 4 colonnes donc je trouve dommage de perdre du temps a tout récupérer pour ensuite supprimer ou inutiliser les 3/4 des données récupérées surtout que el nombre de ligne peut êtr important.
 
Je vous montre en effet le code que j'utilise pour être mais données si quelqu'un peut me dire ou et comment l'adapter pour choisir mes colonnes à extraire.
 
[quote]
kiki29 Posté le 16-07-2007 à 15:22:40    
 
Option Explicit  
 
Sub Csv()  
Dim Fichier As Variant  
    ChDir ThisWorkbook.Path  
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )  
    If Fichier <> False Then  
        LireCSV Fichier  
    End If  
End Sub  
 
Private Sub LireCSV(ByVal NomFichier As String)  
Dim Chaine As String  
Dim Ar() As String  
Dim i As Long  
Dim iRow As Long, iCol As Long  
Dim NumFichier As Integer  
Dim Separateur As String * 1  
 
    Separateur = ";"  
    Cells.Clear  
    Application.ScreenUpdating = False  
    NumFichier = FreeFile  
 
    iRow = 0  
 
    Open NomFichier For Input As #NumFichier  
    Do While Not EOF(NumFichier)  
        iCol = 1  
        iRow = iRow + 1  
        Line Input #NumFichier, Chaine  
        Ar = Split(Chaine, Separateur)  
        For i = LBound(Ar) To UBound(Ar)  
            Cells(iRow, iCol) = Ar(i)  
            iCol = iCol + 1  
        Next i  
    Loop  
    Close #NumFichier  
    Application.ScreenUpdating = True  
 
End Sub  
 
Merci d'avance ;p
 
 

mood
Publicité
Posté le 24-04-2009 à 10:07:38  profilanswer
 

n°1877262
olivthill
Posté le 24-04-2009 à 11:31:41  profilanswer
 

Dans le programme, la variable, qui s'appelle iCol, contient le numéro de la colonne en cours de traitement. Pour ne prendre que les quatre premières colonnes, il suffit de tester si cette variable devient supérieure à quatre. Voici la nouvelle version du programme qui ne contient qu'une seule ligne de plus que l'ancienne :

Option Explicit  
   
Sub Csv()  
Dim Fichier As Variant  
    ChDir ThisWorkbook.Path  
    Fichier = Application.GetOpenFilename("Fichier CSV (*.csv), *.csv" )  
    If Fichier <> False Then  
        LireCSV Fichier  
    End If  
End Sub  
   
Private Sub LireCSV(ByVal NomFichier As String)  
Dim Chaine As String  
Dim Ar() As String  
Dim i As Long  
Dim iRow As Long, iCol As Long  
Dim NumFichier As Integer  
Dim Separateur As String * 1  
   
    Separateur = ";"  
    Cells.Clear  
    Application.ScreenUpdating = False  
    NumFichier = FreeFile  
   
    iRow = 0  
   
    Open NomFichier For Input As #NumFichier  
    Do While Not EOF(NumFichier)  
        iCol = 1  
        iRow = iRow + 1  
        Line Input #NumFichier, Chaine  
        Ar = Split(Chaine, Separateur)  
        For i = LBound(Ar) To UBound(Ar)
            Cells(iRow, iCol) = Ar(i)  
            iCol = iCol + 1  
            If (iCol > 4) Then Exit For
        Next i  
    Loop  
    Close #NumFichier  
    Application.ScreenUpdating = True  
   
End Sub  

n°1877269
Fouinette8​5
Posté le 24-04-2009 à 11:37:33  profilanswer
 

Le problème est que je ne veux pas extraire uniquement les 4 premières colonnes mais quelques colonnes du genre A,B,C, AG,AL,AR.
Et je voudrais appliquer ce code à un autre fichier ou les colonnes ne seraient encore pas les mêmes.  
 
Ce que je n'arrive pas à faire est justement de pouvoir piocher chercher certaine colonne.

n°1877320
olivthill
Posté le 24-04-2009 à 12:41:42  profilanswer
 

Tout d'abord, il faudrait faire une petite conversion manuelle de la lettre de la colonne en un numéro de colonne.
A = 1, B = 2, C = 3, AG = 26 + 7 = 33, AL = 26 + 12 = 38, AR = 26 + 18 = 44.
Puis, il faut changer la partie centrale du code comme ceci :

       For i = LBound(Ar) To UBound(Ar)  
           If (i = 1 Or i = 2 Or i = 3 _
               Or i = 33 Or i = 38 Or i = 44) Then
             Cells(iRow, iCol) = Ar(i)
              iCol = iCol + 1    
           End If
        Next i  

(Le trait de soulignement après "= 3" sert à indiquer que la ligne se prolonge sur la ligne d'en dessous)

n°1877412
Fouinette8​5
Posté le 24-04-2009 à 14:44:16  profilanswer
 

Super grand merci ça marche presque, j'ai plus qu'à comprendre pourquoi il me récupère pas exactement les colonnes que je lui demande mais je doit plus être très loin :p
 
Voila, solution trouvée il fallait commencer à compter de 0, un peu de bidouillage et j'ai trouvé ma solution.  
J'aurais bien avancé aujourd'hui merci de l'aide j'ai plus qu'à l'appliquer sur un autre fichier.
 
Du coup faut que j'adapte le code pour qu'en fonction du nom du fichier choisi ou de l'intitulé de la première colonne il n'extrait pas les mêmes cellules, sa devrait pas être de tout repos mais on va fouiner ça.


Message édité par Fouinette85 le 24-04-2009 à 14:57:10
n°1881006
Fouinette8​5
Posté le 05-05-2009 à 11:16:34  profilanswer
 

Bonjour,  
 
le code à un peu changé depuis le temps mais je n'arrive pas à "coller" les données receuillies à partir du fichier csv sur ma feuille "reception_donnees" située dans un autre fichier (nommé gestion de stock) et pourtant ma fonction s'exécute sans problème.  
Si quelqu'un peut me dire comment puis-je récupérer les données que je parcours sa serais bien sympas.  
 

Code :
  1. Public Sub LireCSV(ByVal Chemin As String, col1 As Integer, col2 As Integer, col3 As Integer, col4 As Integer, col5 As Integer)
  2. Dim Chaine As String
  3. Dim Ar() As String
  4. Dim i As Long
  5. Dim iRow As Long, iCol As Long
  6. Dim NumFichier As Integer
  7. Dim Separateur As String * 1
  8.     Sheets("reception_donnees" ).Activate
  9.     Separateur = ";"
  10.     Cells.Clear
  11.     Application.ScreenUpdating = False
  12.     NumFichier = FreeFile
  13.  
  14.     iRow = 0
  15.     Open Chemin For Input As #NumFichier
  16.     Do While Not EOF(NumFichier)
  17.         iCol = 1
  18.         iRow = iRow + 1
  19.         Line Input #NumFichier, Chaine
  20.         Ar = Split(Chaine, Separateur)
  21.      
  22.        For i = LBound(Ar) To UBound(Ar)
  23.            If (i = col1 Or i = col2 Or i = col3 Or i = col4 Or i = col5) Then
  24.              Cells(iRow, iCol) = Ar(i)
  25.               iCol = iCol + 1
  26.            End If
  27.         Next i
  28.        
  29.     Loop
  30.     Close #NumFichier
  31.     Application.ScreenUpdating = True
  32.     MsgBox "Le fichier à bien été importé !", vbInformation, "Importation de données"
  33.  
  34. End Sub

n°1882029
kiki29
Posté le 07-05-2009 à 23:04:18  profilanswer
 

Salut,
le code donné ,à priori , ne lira jamais la 1ere colonne
il faut remplacer i par i+1
sinon si le classeur s'appelle Stocks.xls et est ouvert


    Windows("Stocks.xls" ).Activate
    Sheets("reception_donnees" ).Cells.Clear
 .....
 
        For i = LBound(Ar) To UBound(Ar)
            If (i + 1 = col1 Or i + 1 = col2 Or i + 1 = col3 Or i + 1 = col4 Or i + 1 = col5) Then
                Sheets("reception_donnees" ).Cells(iRow, iCol) = Ar(i)
  .....

n°1882087
seniorpapo​u
Posté le 08-05-2009 à 07:16:06  profilanswer
 

Bonjour,
n'y aurait-il pas un lien avec:
http://forum.hardware.fr/forum2.ph [...] w=0&nojs=0
??
j'y précise que "line input" ne peut lire ton csv parce qu'à la génération du fichier, il n'y a que des chr(10) comme délimiteurs au lieu de chr(13)+chr(10) attendu. Par contre la séquence que j'ai placée fonctionne. Si tu veux des précisions pour l'intégrer, n'hésite pas à demander.
Cordialement

n°1882834
Fouinette8​5
Posté le 11-05-2009 à 09:17:56  profilanswer
 

J'ai réussi à résoudre mon problème à l'aide des 2 forums merci bien :p


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Extraire que certaines données d'un fichier csv

 

Sujets relatifs
Creation d'un index pour fichiercréer un fichier avec OutputStream
Connaître le contenu d'un fichier compresséCalcul de difference entre 2 dates dans 1 fichier 'Batch'
Affichage d'un fichier texte [Résolu]Copier le contenu d'un fichier texte
[Python] os.path.getsize(fichier)>=98000Debutante : modification des données d'une bdd sous php
ecrire fichier en utilisant httpmatlab lecture données .csv
Plus de sujets relatifs à : Extraire que certaines données d'un fichier csv


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR