![]() |
| 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é. | |||||||
|
|||||||
| Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums. |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: mars 2008
Messages: 31
|
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 (permalink) |
|
Inscrit(e)
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
|
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 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: mars 2008
Messages: 31
|
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 |
|
|
|
|
|
#4 (permalink) |
|
Inscrit(e)
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
|
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 |
|
|
|
|
|
#5 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: mars 2008
Messages: 31
|
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 (permalink) |
|
Inscrit(e)
Date d'inscription: juillet 2007
Localisation: au pays de la liberté d'esprit
Messages: 2 967
|
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 ... |
|
|
|
|
|
#8 (permalink) |
![]() Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
|
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
|
|
|
|
|
|
#9 (permalink) | |
|
Futur Membre du Club
![]() Date d'inscription: mars 2008
Messages: 31
|
Citation:
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 (permalink) |
![]() Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
|
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 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: mars 2008
Messages: 31
|
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 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 ! |
|
|
|
|
|
#12 (permalink) |
![]() Date d'inscription: octobre 2007
Localisation: Montreuil-Le-Gast (I&V)
Âge: 45
Messages: 700
|
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 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,
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+ |
|
|
|
![]() |
![]() |
||
Comment concaténer deux fichiers *.txt ?
|
||
| Outils de la discussion | |
|
|