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

Excel Discussion :

Manipulation de longs fichiers texte


Sujet :

Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Manipulation de longs fichiers texte
    Bonjour à tous,

    Je viens poster pour la première fois sur ce forum car j'ai dans mon travail souvent l'occasion de manipuler Excel. D'habitude j'arrive à me débrouiller mais cette fois ci je suis bloqué et mes connaissances en VB sont trés limitées.
    Voici mon problème:

    J'ai un fichier Excel contenant des codes dans une colonne par exemple: "ABC145-AA455566". A coté de ca j'ai deux fichiers texte F1.txt et F2.txt qui contiennent une liste de codes à la colonne N°205 (par exemple)
    Ce que je veux, c'est vérifier que tous les codes qui apparaissent dans mon fichier Excel sont présents dans un de ces deux fichiers texte et que si possible ca me dise en face de chaque ligne dans lequel le code apparaît. Ma première idée a été d'importer ces fichiers en délimitant les colonne et en faisant une "recherchev". Ca a fonctionné pour le 1er fichier mais pour le second je me suis heurté à un gros soucis: Il y a un peu plus de 500 000 lignes donc pas d'importation possible.
    J'ai alors récupéré une macro qui intègre ce long fichier sur N feuilles excel. Ca marche plutôt bien mais ca m'oblige à faire autant de recherchev qu'il y a de feuille du coup c'est assez lourd à gérer surtout que je veux que l'automatisation soit la plus poussée possible.
    Je veux donc savoir si il est possible de faire en sorte qu'excel aille lire le fichier .txt sur toutes les lignes de la colonne N°205 par exemple, qu'il me dise dans quel fichier apparaît le code et me mette une erreur si le code est introuvable.
    Peut-être que sur Access c'est plus facile à faire, mais comme je ne connais pas du tout j'aimerai me débrouiller avec Excel.

    Merci d'avance

  2. #2
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut,
    Je t'avoue ne pas savoir si il y a moyen de faire une recherchev directement sur txt mais pourquoi ne pas passer par Acces?
    Tu as la possibilité de faire l'import tout comme sur excel, ensuite pourquoi pas un croisé dynamique lié à Access?
    Bonne continuation
    N'oubliez pas le si votre problème est solutionné.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    le problème ce que dans mes fichiers texte à importer je ne veux que les données comprise entre la colonne N°X1 et la colonne N°X2 et je n'ai pas réussi à réaliser cet import de manière automatique dans access (mes colonne ne sont pas délimitées)
    Pour ce qui est du tableau croisé dynamique, je n'en ai jamais utilisé et je me suis longtemps dit qu'il fallait que je m'y mette, je crois que l'occasion est venue.
    Il serait donc possible d'avoir mon long fichier sur access (importé par je ne sais quelle manière) et que mon fichier excel aille vérifier dedans si certaines données sont présentes?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut
    Bonjour,

    Si je ne me trompe pas on peut lire dans des fichiers texte en VBA (pas trop le temps de tester à l'instant désolé ). Dans ce cas la il suffirait de rechercher la chaine de caratere, correspondant au code contenu dans la cellule, dans les deux fichiers texte (commencer par F1 et si pas dans F1 faire F2, je ne sait pas si on peut paralléliser les recherches) et de renvoyer le nom du fichier dans lequel celle-ci a été trouvée.

    Je suppose que tes fichiers texte sont en fait des fichiers avec séparateur ?

    Par contre je ne sait pas ce qui peut se passer au niveau du temps de traitement sur des fichiers comportant beaucoup de ligne !

    Cordialement.
    Darki03

  5. #5
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    Pour importer dans Access, c'est pas trop compliqué:
    File \ Get external data \ Import
    Tu auras alors une fenêtre dans laquelle tu précises que c'est un fichier texte et tu sélectionne ton fichier. La suite ressemble très fortement à Excel, tu devrais t'y retrouver.

    Pour ce qui est du TCD, comme tu le dis, il faut s'y mettre...

    Bonne continuation,
    N'oubliez pas le si votre problème est solutionné.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut
    Re-Bonjour,

    J'ai tenté un petit truc (j'ai testé rapidement ça marche). Je suis parti du principe que F1 et F2.txt sont des fichiers avec séparateur type ; pour les colonnes:

    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
     
    Sub Chercher_txt()
    'Declaration des variables
    Dim Chaine As String
    Dim Source As String
    Dim Ar() As String
    Dim i As Long
    Dim Comp, NomFichier_1, NomFichier_2, end_line
    Dim Presence_1 As Boolean
    Dim Presence_2 As Boolean
    Dim Colonne As Integer
    Dim Separateur As String * 1
     
    'Initialisation des variables
    Presence_1 = False
    Presence_2 = False
    Colonne = 124 '(Colonne du fichier txt contenant les codes)-1
    Separateur = Chr(59) 'separateur = ;
    end_line = Range("A65536").End(xlUp).Row 'Ligne de fin de la colonne contenant les élément a chercher
     
    'Fenetre de choix pour les deux fichiers
    f = Application.GetOpenFilename("Fichier de codes,*.txt", , "Choisir les deux fichiers de codes", , True)
    If VarType(f) = vbBoolean Then Exit Sub
     
    'Stockage du nom des deux fichiers
    NomFichier_1 = f(1)
    NomFichier_2 = f(2)
     
    For i = 1 To end_line
    Comp = 1
    Source = Cells(i, 1).Value 'Cellule contenant l'élément a chercher
     
    'Recherche de la chaine dans le fichier 1
    Open f(1) For Input As #1
        Do While (Not EOF(1)) And (Comp <> 0)
            Line Input #1, Chaine
            Ar = Split(Chaine, Separateur)
            Comp = StrComp(Ar(Colonne), Source)
        Loop
    Close #1
     
    If Comp = 0 Then 'Si la chaine a été trouvée dans 1
      Presence_1 = True
      Cells(i, 2).Value = NomFichier_1 'On récupère le nom du fichier 1
    Else 'Sinon On cherche dans 2
    'Recherche de la chaine dans le fichier 2
      Comp = 1
      Open f(2) For Input As #2
        Do While (Not EOF(2)) And (Comp <> 0)
            Line Input #2, Chaine
            Ar = Split(Chaine, Separateur)
            Comp = StrComp(Ar(Colonne), Source)
        Loop
      Close #2
     
     If Comp = 0 Then 'Si la chaine a été trouvée dans 2
      Presence_2 = True
      Cells(i, 2).Value = NomFichier_2 'On récupère le nom du fichier 1
     Else 'Sinon l'élément cherché est dans aucun des deux fichiers
      Cells(i, 2).Value = "Code not found"
     End If
     
    End If
     
    Next
     
    End Sub
    J'ai pas eu le temps de bien commenter désolé ! si tu as des questions n'hésite pas. Pour les gros fichier le temps de traitement risque d'etre long !

    Ce bout de code peut etre surement amélioré et surtout robustifié ^^!

    J'espère avoir bien cerné ton problème !

    A +
    Darki03

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci pour vos réponse, mon fichier ne contient pas de séparateurs, j'ai une doc avec qui me dit de la colonne 1 à 10, j'ai le champ N°1, de 20 à 240 le champ n° 2, etc. donc pas facile d'importer avec la fonction classique car il faut se taper les définitions de toutes les largeurs de champs à la souris.
    J'ai dans mes fichiers texte 2 informations à rechercher, il faut que la chaîne recherchée soit présente dans ce fichier c'est déjà un premier point mais qu'en plus si la valeur existe, il faut qu'elle ai sur sa ligne dans un autre champ la valeur Y. Autant dire que c'est assez tordu, je ne sais pas dans quel sens le prendre...

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par DSJ63 Voir le message
    Merci pour vos réponse, mon fichier ne contient pas de séparateurs, j'ai une doc avec qui me dit de la colonne 1 à 10, j'ai le champ N°1, de 20 à 240 le champ n° 2, etc. donc pas facile d'importer avec la fonction classique car il faut se taper les définitions de toutes les largeurs de champs à la souris.
    J'ai dans mes fichiers texte 2 informations à rechercher, il faut que la chaîne recherchée soit présente dans ce fichier c'est déjà un premier point mais qu'en plus si la valeur existe, il faut qu'elle ai sur sa ligne dans un autre champ la valeur Y. Autant dire que c'est assez tordu, je ne sais pas dans quel sens le prendre...
    j'avoue avoir du mal a voir comment sont structurés tes fichiers ! Pourrait tu poster un exemple de fichiers (si il n'y a rien de confidentiel dedans ^^!)

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    et bien c'est un fichier texte de ce qu'il y a de plus classique par exemple ici je fait un fichier avec un premier champ de 10 colonnes de large suivi d'un champ de 4 colonnes remplies:
    XDFERTGH AAAA
    SAAASQQ 1234

    Le premier champ n'étant pas complet, il y a 2 espaces (8+2=10)

    Je souhaite donc que lorsque je met une valeur dans une cellule excel, il y ai "un quelque chose" qui aille chercher dans ce fichier texte si la valeur existe et me renvoi la valeur de longueur 4 caractères commencant à la colonne N°11
    ex: dans excel je tape LSLDKEIE dans la cellule A1
    Ca me renvoi un N/A dans la celulle B1

    Je tape XDFERTGH dans la cellule A2, ca me renvoi AAAA dans la celulle B2 (ligne 1 de mon exemple de fichier texte)

    Dans l'idéal, si j'avais pu insérer mes fichiers texte dans Excel j'aurai eu "Si la recherchev dans ma liste 1 ne me donne pas N/A, afficher 1 si la valeur apparaît dans la liste 1, m'afficher 2 si la valeur apparaît dans la liste 2." (en bidouillant avec un coupe recherchev et une condition) bref ca aurait été super simple mais la... je crois qu'il va falloir gratter un moment..

  10. #10
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 43
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par DSJ63 Voir le message
    et bien c'est un fichier texte de ce qu'il y a de plus classique par exemple ici je fait un fichier avec un premier champ de 10 colonnes de large suivi d'un champ de 4 colonnes remplies:
    XDFERTGH AAAA
    SAAASQQ 1234

    Le premier champ n'étant pas complet, il y a 2 espaces (8+2=10)
    Est ce toujours le cas ou la structure des fichiers peut elle évoluer ? Faut il rechercher dans plusieurs champs ?

    On doit pouvoir lire une certaine longueur de champ ligne par ligne et la comparer à la valeur cherchée puis retourner le champ d'a coté si celle ci est présente. Après si il faut chercher dans plusieurs champs avec des longueurs différentes et sans séparateur cela demande reflexion !

    Cordialement.
    Darki03.

  11. #11
    Expert éminent
    Avatar de cafeine
    Inscrit en
    Juin 2002
    Messages
    3 904
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 3 904
    Points : 6 781
    Points
    6 781
    Par défaut
    Hello,

    le plus simple me paraît de faire une lecture séquentielle (ligne par ligne à la suite de ton fichier).
    sinon tu peux aussi essayer de lire ton fichier avec DAO.

    Exemple de lecture séquentielle :
    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
    Function GetFicLine(ByVal strPath As String, ByVal str As String) As String
     
    Application.Volatile
     
    Dim fso As Object
    Dim ts As Object
    Dim tmp As String
     
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(strPath, 1)
     
    Do While Not ts.AtEndOfStream
          tmp = ts.Readline
          If tmp Like "*" & str & "*" Then
            GetFicLine = tmp
            GoTo GetOut
          End If
    Loop
     
    GetFicLine = "Aucune correspondance"
     
    GetOut:
    Set fso = Nothing
    Set ts = Nothing
     
    End Function
    Ne mettez pas "Problème" dans vos titres, par définition derrière toute question se cache un problème
    12 tutoriels Access



Discussions similaires

  1. parsing et manipulation d'un fichier texte
    Par princessita dans le forum Général Python
    Réponses: 2
    Dernier message: 09/02/2014, 21h25
  2. Réponses: 0
    Dernier message: 19/05/2009, 16h02
  3. manipulation d'un fichier texte
    Par helene_53 dans le forum C#
    Réponses: 2
    Dernier message: 21/05/2008, 00h23
  4. Manipuler un gros fichier texte
    Par bremer dans le forum Langage
    Réponses: 14
    Dernier message: 27/02/2008, 19h16
  5. [BATCH] Manipulation dans un fichier texte
    Par Bloodscalp dans le forum Windows
    Réponses: 2
    Dernier message: 13/09/2006, 15h49

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