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

Macros et VBA Excel Discussion :

Boucle while until EOF et .csv : problème


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Par défaut Boucle while until EOF et .csv : problème
    Bonjour,

    Comme l'indique le titre du sujet, j'ai un soucis avec la fonction EOF sur les fichiers csv.

    Voici le besoin : je dois, à partir d'une macro excel, pouvoir exploiter des CDR (Call Detail Record). Ma macro sert donc à les récuperer depuis le serveur et ensuite les ouvrir puis faire le tri.
    Je bloque entre l'étape d'ouverture du fichier et remplissage.

    Pour faire ce remplissage (je n'ai pas encore fait un quelconque tri, je cherche juste à remplir une feuille excel avec le fichier csv), je me sers d'une boucle qui bouclera tant que je ne suis pas en fin de fichier.

    Problème : cette boucle s’arrête dès la fin de la première ligne.

    Voici la fonction assurant l'ouverture du fichier et son remplissage

    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
     
    Private Function fillSheet(path As String)
        Dim ws As Worksheet
     
        path = Mid(path, 2, Len(path) - 2) 'Je retire les " en debut et fin de chaine
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "Test"
        Open path For Input As #1
        row_number = 0
        Do Until EOF(1)
            Line Input #1, linefromfile
     
            lineitems = Split(linefromfile, ";")
     
            ActiveCell.Offset(row_number, 0).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
            ActiveCell.Offset(row_number, 1).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
            ActiveCell.Offset(row_number, 2).Value = Mid(lineitems(2), 2, Len(lineitems(2)) - 2) 'Je retire les " en debut et fin de chaine
     
            row_number = row_number + 1
        Loop
     
        Close #1
    End Function
    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Par défaut
    Okay j'ai compris.

    En gros, les lignes ne sont pas séparés par des retour à la ligne mais par des espaces...
    Hmm...

  3. #3
    Invité
    Invité(e)
    Par défaut
    bonjour,
    les champ texte sont encadrés pars des double cote ["]
    "Champ1";"Champ2"
    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
    Private Function fillSheet(path As String)
        Dim ws As Worksheet
     
        path = Mid(path, 2, Len(path) - 2) 'Je retire les " en debut et fin de chaine
        Set ws = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
        ws.Name = "Test"
        Open path For Input As #1
        row_number = 0
         While EOF(1) = False
            Line Input #1, linefromfile
     
            lineitems = Split(Replace(linefromfile, Chr(34), ""), ";") 'je remplace le double cote par du vide! et je split
            ActiveSheet.Range(ActiveCell.Offset(row_number, 0), ActiveCell.Offset(row_number, UBound(lineitems) - 1)) = lineitems 'maintenant je peut affecter la totalité du tableau en une passe! 
    '        ActiveCell.Offset(row_number, 0).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
    '        ActiveCell.Offset(row_number, 1).Value = Mid(lineitems(1), 2, Len(lineitems(1)) - 2) 'Je retire les " en debut et fin de chaine
    '        ActiveCell.Offset(row_number, 2).Value = Mid(lineitems(2), 2, Len(lineitems(2)) - 2) 'Je retire les " en debut et fin de chaine
     
            row_number = row_number + 1
        Wend
     
        Close #1
    End Function

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Par défaut
    Merci pour la réponse.

    Le soucis ne vient pas des champs texts en eux même, mais de la facon dont sont délimités les lignes de mon fichier csv.

    Je croyais au début que ces lignes étaient délimitées par des espaces mais finalement ce n'est pas le cas. Elle sont délimités par ...autre chose (c'est forcement autre chose vu que lorsque j'execute manuellement le fichier avec excel, celui ci repositionne bien tout).
    J'essaie maintenant de remplacer ce... truc par des \n (nouvelle ligne).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     lineitems = Replace(lineitems, Chr(13), Chr(10)) 'dans l'hypothese que ce soit un retour charriot

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pourquoi ne te simplifies-tu pas la vie en faisant un simple Workbooks.Open qui ouvrira ton fichier CSV en tant que classeur Excel ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 121
    Par défaut
    Merci pour vos réponses

    Citation Envoyé par Menhir Voir le message
    Pourquoi ne te simplifies-tu pas la vie en faisant un simple Workbooks.Open qui ouvrira ton fichier CSV en tant que classeur Excel ?
    Je compte trier les informations présentes dans le fichier csv : tout ne m'est pas utile.
    Je suppose que c'est plus rapide à faire en récupérant directement les colonnes voulues qu'en supprimant après avoir ouvert le classeur. (surtout que des colonnes, j'en ai un paquet... alors qu'il n'y en a au final peu qui m'interessent vraiment)

    Voici un exemple de fichier (c'est long), je n'ai pris que les deux premières lignes

    "RECORDID";"STARTUNIXTIME";"DATETIMEEND";"HOLDDURATION";"NBHOLD";"RINGDURATION";"TALKDURATION";"CONFDURATION";"CALLINITIATOR";"CALLERNUMBER";"CALLEREXTERNALNUMBER";"DIALEDNUMBER";"CALLEDNUMBER";"CALLEDEXTERNALNUMBER";"CALLERNAME";"CALLERDEVICENAME";"CALLEDNAME";"CALLEDDEVICENAME";"IPBXNAME";"COMMUNITYNAME";"AAASESSIONID";"CALLTYPE";"TERMINATIONCAUSE";"DIAGNOSTIC";"CDRSTATUS";"ACCOUNTCODE";"DEPARTMENT";"SITE";"CALLID";"BILLINGACCOUNTCUSTOM1";"BILLINGACCOUNTCUSTOM2";"REDIRECTIONCAUSE";"REDIRECTTIMESTAMP";"NEXTRECORDID";"CALLERTYPE";"CALLEDTYPE";"CALLFLOWID";"OWNERADMTIVEDOMAINID";"CREATETIMESTAMP";"DATETIMEENDGMT";"JOKERFIELD";"ISSUERIP";"SIPCALLID1";"SIPCALLID2";"CALLTAG";"CALLRECORDINGNAME";"FAXPAGES";"EXTERNALCALLID";"CALLTYPEFORBILLING"
    "CDF";"1411*****";"2014-09-28 11:40:56";"0";"0";"2";"2";"0";"0627*****";"0627*****";"0627*****";"+33172*****";"200";"01721*****";"33627*****";"[GATEWAY].GwOpenVoice";"";"[csip-snom-821].000*******-master-1";"TC1";"CDFE";"";"E_Incoming";"SRC_DSC";"";"N";"";"Default";"";"CId[493756]";"CFDE";"CFDE";"CFAL";"141189*****7";"CDFE.1411******21.virt.8524.[200]";"EXTERNAL_NUMBER";"STATION";"CDFE.141189******9.conn.493758.[062******0]";"0.9.";"1411897******";"";"";"172.******:50**";"543d9dc*********23b9352402502@94.********";"";"";"";"0";"";"EC"

    Comme vous pouvez le constater, entre "CALLTYPEFORBILLING" et "CDF", il y a un caractere spécial qui est n'est pas consideré, dans ma macro, comme un changement de ligne (du coup, au lieu d'avoir un plusieurs lignes de 49 colonnes, il considère que j'en ai une seule avec 2000+ colonnes)

  7. #7
    Invité
    Invité(e)
    Par défaut
    ça n'est jamais de retour chariot des tabulation ??

    Bonjour,
    donne un exemple de CSV!
    si il faut que tu bidonne les données utilise Notepad++ car Notepad va replacer les tabulations par des espaces! Notepad++ est gratuit!
    Dernière modification par AlainTech ; 02/10/2014 à 22h02. Motif: Fusion de 2 messages

  8. #8
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Je viens de faire le test et il me semble que NotePad conserve les tab.
    Tu ne confondrais pas avec l'éditeur VBA ?

Discussions similaires

  1. Interompre boucle while not EOF(F)
    Par sp2308 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2009, 23h28
  2. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11
  3. Problème de SCANF dans une boucle WHILE
    Par FidoDido® dans le forum C
    Réponses: 4
    Dernier message: 30/12/2005, 17h42
  4. [Conception] Problème de test dans une boucle while
    Par Cyrius dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/11/2005, 18h07
  5. Problème avec Do while rs.EOF
    Par lauraned dans le forum ASP
    Réponses: 12
    Dernier message: 21/05/2004, 12h00

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