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

VBA Discussion :

Comment concaténer deux fichiers *.txt ?


Sujet :

VBA

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut Comment concaténer deux fichiers *.txt ?
    Bonjour,

    je dispose de deux fichiers textes du type suivant :

    - Fichier texte 1 :
    ligne 1 : colonne1 colonne2
    ligne 2 : colonne1 colonne2
    ligne 3 : colonne1 colonne2
    ligne n : colonne1 colonne2

    - Fichier texte 2 :
    ligne 1 : colonne3
    ligne 2 : colonne3
    ligne 3 : colonne3
    ligne n : colonne3

    Evidemment, à chaque ligne les valeurs sont différentes.

    Je souhaiterai concaténer les deux fichiers de la façon suivante :

    - Fichier texte 3 :
    ligne1 [du fichier texte 1] + ligne1 [du fichier texte 2]
    ligne2 [fichier texte 1] + ligne2 [fichier texte 2]
    ligne3 [fichier texte 1] + ligne3 [fichier texte 2]
    ligne "n" [fichier texte 1] + ligne "n" [fichier texte 2]

    Ce qui donnerai :

    - Fichier texte 3 :
    colonne1 colonne2 colonne3 (pour la ligne1)
    colonne1 colonne2 colonne3 (pour la ligne2)
    colonne1 colonne2 colonne3 (pour la ligne "n")

    Je pourrais lire les valeurs des deux fichiers textes puis les concaténer en faisant :
    ligne1_fichier_texte1 & ligne1_fichier_texte2
    ligne"n"_fichier_texte1 & ligne"n"_fichier_texte2

    mais je voudrais savoir s'il existe une autre façon de procéder ?

    Dans l'attente, merci à vous.

  2. #2
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Concaténer est en effet concaténer ....

    Et il n'est pas possible de concaténer 2 chaines que l'on ne connait pas

    Il faut donc les lire toutes les 2, puis les concaténer, puis écrire le résultat

    Et c'est ce que tu fais...
    Alors : lire ligne par ligne dans les 2 fichiers en vue d'un traitement de concaténation au fur et à mesure
    ou
    Faire un split de chaque fichier pour obtenir 2 Arrays et traiter ensuite, en vue de la concaténation, chaque élément d'un array avec l'élément correspondant de l'autre array

    revient rigoureuseùent au même ...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Bonjour ucfoutu et merci pour ta réponse,

    je ne sais pas "Faire un split de chaque fichier pour obtenir 2 Arrays" mais je suis curieux d'apprendre et d'esseyer cette technique. Est-il possible d'avoir un bout de code pour mieux comprendre la différence avec la précédente technique qui consiste à lire les données des deux fichiers textes puis les écrires ?

    Avantages et inconvénients ?

    Merci.

  4. #4
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bon...

    J'ai longuement hésité à répondre ici...

    Je considère en effet que la consultation de ton aide en ligne est largement suffisante (je n'ai jamais rien eu d'autre !!!!).

    J'ai fini par trouver le moyen de ménager la chèvre et le choux, par cet exemple, que j'estime suffisamment "éclairant", tout en n'écrivant pas ton code "tout cuit"...

    Je te demande d'analyser ceci, de comprendre ce que ça fait (aide-toi de ton aide en ligne) et de t'en servir intelligemment... (je ne reviendrai plus sur cette discussion). J'ai commenté, pour t'aider à comprendre...


    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
    Option Explicit
     
    Private Sub UserForm_Initialize()
      'ceci n'est là que pour "constituer" un petit fichier de test, rien de plus
      Dim fichier As String
      fichier = "C:\essai.txt"
      Open fichier For Output As #1
        Print #1, "bonjour"
        Print #1, "comment vas-tu ?"
        Print #1, "Bye"
      Close #1
    End Sub
     
    Private Sub Command1_Click()
       Dim fichier As String, titi, strtext As String, I As Integer
       fichier = "c:\essai.txt"
       Open fichier For Input As #1
          strtext = Input(LOF(1), #1)
       Close #1
       'juste pour que tu vois sur quoi tu vas travailler
       MsgBox "voilà la totalité du contenu de ton fichier " & fichier & vbCrLf & strtext
       'on va éclater ce fichier, avec split, sur le retour à la ligne (constante vbcrlf sous VB)
       titi = Split(strtext, vbCrLf)
       'et maintenant on va lire chaque élémùent de l'array titi ainsi obtenu
       For I = 0 To UBound(titi)
         MsgBox titi(I)
       Next
    End Sub
    Bonne étude....

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Bonjour à nouveau ucfoutu,

    je viens de lire et tester le bout de code que tu m'as proposé. C'est génial ! Je ne connaissais pas du tout la fonction Split, ni le séparateur vbCrLf et la fonction UBound. Le code que tu viens de me proposer va me simplifier et me permettre d'accélérer le traitement de tous mes fichiers. Encore un grand merci pour avoir "ménagé la chèvre et le choux", que cet exemple puisse servir à d'autres utilisateurs/programmeurs !

    Petite question d'ordre pragmatique, toi qui a du recul sur l'utilisation de cette fonction :
    - y a t'il une limite au niveau de la taille des fichiers à traiter ? Je peux avoir à traiter des fichiers de l'ordre de 6 millions de lignes, quand certains pèsent pas 400 Mo.

  6. #6
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonjour,

    Pour un énorme fichier, tu n'auras pas intérêt à charger en mémoire (ton array généré par le split) la totalité...

    Il vaudra mieux le lire ligne par ligne, dans un tel cas.

    Ouvre ton aide en ligne sur les mots "Open" et "Line Input".
    Regarde l'exemple qui va avec...
    Tu as par ailleurs une énorme quantité d'exemples d'utilisation sur ce forum.
    Je te laisse d'abord chercher et te débrouiller un peu seul, hein ...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    C'est bon pour le mode "Open" et "Line Input", ca marche
    Merci.

  8. #8
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut Concaténer 2 fichiers
    Salut,

    Tu devrais essayer des logiciels comme Word pour traiter du texte ou Excel pour traiter des tableaux ou des colonnes .

    Je pense qu'avec un truc comme ouvrir, un remplacement global et un seul copier-coller devrait suffire j'oubliais la sauvegarde au format txt. En plus, ça marche avec plus ou moins de colonnes, et plus ou moins de lignes

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Sepia Voir le message
    Salut,

    Tu devrais essayer des logiciels comme Word pour traiter du texte ou Excel pour traiter des tableaux ou des colonnes .

    Je pense qu'avec un truc comme ouvrir, un remplacement global et un seul copier-coller devrait suffire j'oubliais la sauvegarde au format txt. En plus, ça marche avec plus ou moins de colonnes, et plus ou moins de lignes
    J'espère que c'est un canulard ? Justement si je travail en mémoire et sur des fichiers textes c'est d'abord pour outre passer la limite d'Excel à 65536 lignes (Office 2003) ! Quand à Office 2007 et ses 1 millions ne lignes, il ne suffit pas non plus pour traiter plus de 4 millions le lignes à la fois.

    Et quand bien même ce serait le cas, n'oublions pas qu'Excel/Word est une interface WYSIWYG, c'est dire la lenteur d'un rechercher/remplacer ! Sur 4 000 000 de lignes il faudrait compter une heure, tandis qu'en travaillant en mémoire il faut moins d'une minute ...

  10. #10
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut Travailler Word en mémoire
    Salut,

    Non, ce n'est pas un canular. Evidemment, si tu nous donnes la moitié des contraintes (en particulier sur le nb de lignes) qu'après coup, on a du mal à le deviner.

    Quant au pb du WYSIWYG, c'est un faux pb. Il suffit de demander à Word/Excel de travailler en arrière-plan sans mise à jour de l'interface (Regarde le temps que tu gagnes si tu mets une boite de dialogue ou une fenêtre modale devant Word, tu seras très surpris)

    Quant au rechercher/remplacer global, tu as plus de facilité avec des caractères génériques car tu trouves plus facilement des cas de recherche qu'avec une simple recherche codée sur les valeurs directes, surtout si tu en as autant.

    Crois-moi pour avoir effectuer des macros avec Word sur des gros (très gros) documents, tu as de la marge avant d'atteindre des limites mais tu as raison elles existent, mais si tu ne le dis pas c'est pas évident comme de deviner.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 57
    Points : 34
    Points
    34
    Par défaut
    Bonsoir Sepia,

    peut-être n'as tu pas lu toutes mes réponses ? Réponse dans laquelle je précise à ucfoutu "Je peux avoir à traiter des fichiers de l'ordre de 6 millions de lignes, quand certains pèsent pas 400 Mo", à bon entendeur.

    Certes les contraintes ont été évoquées après le message de ucfoutu, mais évoquées. Je te remercie toutefois de l'intérêt que tu porte à ce sujet.

    Pour ce qui est de l'interface WYSIWYG à moins que tu me prouves le contraire, je ne suis pas tout à fait d'accord avec toi.

    Il suffit d'ailleurs de désactiver la mise à jour de l'écran (par Application.ScreenUpdating = False) pour se faire son propre avis ! Le temps de calcul peut ainsi être diminué jusqu'à 10 000 fois selon la complexité des calculs opérés. L'interface est donc un fardot, ce qui, tu l'as bien compris, m'incite à travailler uniquement en lecture/écriture sur des fichiers ASCII et non sur une interface graphique.

    Pour avoir réalisé des tests sous Office 2003 et Office 2007 (Excel en particulier) je remarque qu'à configuration équivalente, les mêmes calculs prennent plus de temps sous Excel 2007. Peut-être est-ce lié à l'interface plus gourmande d'Office 2007 ? En attendant confirmation.

    Quoiqu'il en soit je pense que nous sommes d'accord la dessus : les manipulations de chaine de caractère en mémoire sont bien plus rapides que celles effectuées sous Excel sur des lignes/colonnes.

    Pour ce qui est Word, je ne puis me prononcer, n'ayant jamais réellement vu l'intérêt de réaliser de telle macro. Je suis dans ce cas à l'écoute si tu as des solutions à me proposer.

    Afin de préciser mon travail, je manipule des fichiers textes contenant environ 4 millions de lignes, chacune étant évidemment différente, mais ressemblant à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    549500.00 2189500.000 1.67610403 46.70356770 46.705947545546 1.67610403496324


    Citation Envoyé par Sepia Voir le message
    Salut ...
    Bonjour Sepia, j'ai bien résolu mon problème depuis un certain temps déjà, mais comme je l'ai évoqué dans mon précédant je suis ouvert par votre retour d'expèrience concernant un sujet que vous exploitez mieux que moi : les macro Word. Kézako ? Auriez-vous un exemple pratique d'application ?

  12. #12
    Expert éminent
    Avatar de Sepia
    Homme Profil pro
    Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Inscrit en
    Octobre 2007
    Messages
    3 117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur du cursus IDE@L - Chef de Projet NCU (digital learning) - Université de Rennes
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 3 117
    Points : 6 856
    Points
    6 856
    Par défaut Les macros Word
    Bonjour Thomcat

    Les macros Microsoft Office sont des programmes écrits en langage interprété le VBA (de type script). Elles sont composées de lignes de code lues et exécutées au fur et à mesure de leur transmission à l'interpréteur VB contenu dans chaque programme de Microsoft Office. Comme tous les programmes écrits en Basic (donc en VBA), la syntaxe est celle du Basic (je suis bien content de t'apprendre ça ) mais comme cet interpréteur est contenu dans un programme Office, Microsoft fournit des objets permettant de réutiliser à des fins spécifiques les éléments manipulées dans l'application concernée, ainsi que des méthodes permettant d'exécuter les commandes de l'interface. Ainsi dans Word, on peut accéder à l'objet Sélection et on peut le mettre en gras
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Selection.Font.Bold = wdToggle
    .

    Word dispose d'en enregistreur de macro, qui permet de transformer les actions de l'utilisateur en code VBA. Pour mieux te rendre compte,
    1. Ouvre word
    2. Exécute la commande "Outils-Macro-Nouvelle macro..."
    3. Donne-lui un nom
    4. Fais plein d'action dans Word
    5. Exécute la commande "Outils-Macro-Arrêter l'enregistrement"


    Regarde le code qu'il t'a généré. Il est loin d'être optimisé et ne comporte pas de boucles mais il te permet de bien prendre la main (avec le bon code)

    Tiens-nous au courant. A+

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

Discussions similaires

  1. [D7][WIN32]concaténer deux fichiers
    Par Herk77 dans le forum Delphi
    Réponses: 14
    Dernier message: 06/10/2006, 15h59
  2. comment modifier un fichier txt
    Par marco1980 dans le forum C++
    Réponses: 3
    Dernier message: 29/09/2006, 01h47
  3. Importer deux fichiers .txt et les mettres en corréalation !
    Par NoRKi dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 24/09/2006, 22h28
  4. Concaténer deux fichiers binaires
    Par mickael.be dans le forum Delphi
    Réponses: 7
    Dernier message: 30/07/2006, 13h11
  5. Comment concaténer plusieurs fichiers en un ?
    Par souch dans le forum Langage
    Réponses: 16
    Dernier message: 14/12/2004, 18h58

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