Forum des développeurs  

Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Général VBA

Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.

Réponse
 
Outils de la discussion
Vieux 10/03/2008, 11h18   #1 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
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.
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/03/2008, 07h41   #2 (permalink)
Inscrit(e)
 
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
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 ...
ucfoutu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/03/2008, 11h02   #3 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
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.

Dernière modification par thomcat ; 13/03/2008 à 14h16
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 13/03/2008, 21h12   #4 (permalink)
Inscrit(e)
 
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
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 :
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....
ucfoutu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/03/2008, 09h34   #5 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
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.
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 14/03/2008, 09h56   #6 (permalink)
Inscrit(e)
 
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
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 ...
ucfoutu est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/03/2008, 09h57   #7 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
Par défaut

C'est bon pour le mode "Open" et "Line Input", ca marche
Merci.
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/03/2008, 16h43   #8 (permalink)
Rédacteur
 
Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
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
Sepia est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/03/2008, 22h21   #9 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
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 ...
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 18/03/2008, 23h47   #10 (permalink)
Rédacteur
 
Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
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.
Sepia est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 19/03/2008, 00h24   #11 (permalink)
Futur Membre du Club
 
Date d'inscription: mars 2008
Messages: 31
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 :
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 ?

Dernière modification par PRomu@ld ; 13/06/2008 à 11h32 Motif: Fusion !
thomcat est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 11/04/2008, 23h47   #12 (permalink)
Rédacteur
 
Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
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 :
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+
Sepia est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Microsoft Office > Général VBA

 
Offres d' emploi informatique sur Lesjeudis.com


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide