Fusion de fichiers txt suivant le modele dir > malist.txt

hctad1

XLDnaute Junior
Bonjour a tous,
pour différentes raison, il m'arrive d'utiliser la fonction DOS Dir > malist.txt qui me permet de lister dans un fichier txt le contenu d'un repertoire et de ses sous répertoires.
Par ailleurs, il m'arrive aussi d'utiliser un petit utilitaire pour concatener un ensemble de fichier txt dans un seul.

Ce que je cherche à faire aujourd'hui est un peu plus compliqué.

Mon résultat final devrait être un fichier (txt ou csv) ou je vais :
dans la 1ere colonne :
Lister le contenu des fichiers.
typiquement cela va me donner une liste du type
DEFINE (xxxxxx,'hhhhh')
DEFINE (fffff,'fffffxx')
DEFINE (aazezdc,'sdssd')
dans la deuxième colonne:
je souhaite indiquer la source de la ligne.
Typiquement:
c:/monrepertoire/language/french/1erfichier
/monrepertoire/language/french/2emefichier​

Le but de tout ça étant de lister l'ensemble des define contenus dans les fichiers du repertoire (et sous repertoire) french.
Puis de faire la même chose dans le répertoire english
et enfin de comparer les deux fichiers pour pouvoir voir s'il manque des DEFINE dans l'un ou l'autre des fichiers des deux repertoire distincts.

POur être tout à fait complet, je vais vous expliquer la finalité de l'opération.

J'ai un site web qui initialement est prévu pour fonctionner avec plusieurs langues.
Depuis 3 ans , nous n'utilisions que le francais et donc quand des ajouts de fonctions ont été faits, des DEFINE ont été ajoutés dans des fichiers contenus dans le repertoire FRENCH.
Aujourd'hui je souhaite utiliser 3 autres langues, il faut donc que je vérifie que la liste des DEFINE soit complète dans chacunes des langues.

Les fichiers que nous allons concatener sont donc des fichiers PHP
exemple :
contenu du fichier :
C:\Program Files\EasyPHP1-8\www\includes\languages\french\account_edit.php

define('NAVBAR_TITLE_1', 'Mon compte');
define('NAVBAR_TITLE_2', 'Editer compte');
define('HEADING_TITLE', 'Information de mon compte');
define('MY_ACCOUNT_TITLE', 'Mon compte');

In fine je souhaite obtenir le format suivant :
define('NAVBAR_TITLE_1', 'Mon compte');C:\Program Files\EasyPHP1-8\www\includes\languages\french\account_edit.php
define('NAVBAR_TITLE_2', 'Editer compte');C:\Program Files\EasyPHP1-8\www\includes\languages\french\account_edit.php
define('HEADING_TITLE', 'Information de mon compte');C:\Program Files\EasyPHP1-8\www\includes\languages\french\account_edit.php
define('MY_ACCOUNT_TITLE', 'Mon compte');C:\Program Files\EasyPHP1-8\www\includes\languages\french\account_edit.php
define('AUTRE_FICHIER', 'Mon texte');C:\Program Files\EasyPHP1-8\www\includes\languages\french\sous-repertoire\autre_fichier.php

On remarquera que chacune des lignes de DEFINE est terminée par un ";" donc a déjà notre séparateur de colonne.

Si quelqu'un a une solution simple ) proposer, je lui en serais reconnaissant car je n'ai aucune idée par quel bout prendre le problème.

Merci d'avance,
Nicolas
 

hctad1

XLDnaute Junior
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Bonjour,
merci pour la réponse rapide.

J'ai regardé un peu et la commande find ne me convient pas tout a fait, j'ai donc fait des test avec la command findstr.

Je n'ia pas vu comment écrire toutes la ligne contenant la chaine cherchée suivie du chemin du fichiers.
je peux afficher toutes les occurences,
je peux afficher le nom du fichier dans lequel j'ai trouvé l'occurence

mais pas les deux sur une seule ligne...
 

SubEndSub

XLDnaute Occasionnel
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Bonjour chez vous



Voici un code VBA de Dave PETERSON (lu sur au autre forum) modifié pour ta problématique.

Importer le module dans un classeur (voir pièce jointe)
Changer le nom du répertoire qui lors du test était c:\test
Copier dans le répertoire choisi deux, trois fichiers texte (extension txt) contenant ces lignes :

define('NAVBAR_TITLE_1', 'Mon compte');
define('NAVBAR_TITLE_2', 'Editer compte');
define('HEADING_TITLE', 'Information de mon compte');
define('MY_ACCOUNT_TITLE', 'Mon compte');

Puis tester la macro

(Il reste à modifier le code pour faire une recherche dans les sous-répertoires)
 

Pièces jointes

  • Module1.zip
    984 bytes · Affichages: 48
  • Module1.zip
    984 bytes · Affichages: 51
  • Module1.zip
    984 bytes · Affichages: 47

SubEndSub

XLDnaute Occasionnel
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

En relisant ta réponse de11h58

J'ai testé findstr

et c'est beaucoup plus simple ;)

Cela fonctionne parfaitement (et les sous-répertoires sont parcourus dans ce cas )


C:\Test>findstr /R /S "define" c:\Test\*.txt >>output.xls
 

hctad1

XLDnaute Junior
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Bon, bon, bon.

D'abord merci pour tes réponses.

J'ai donc testé le findstr.... et si je crée bien le fichier output.xls, celui-ci est vide. J'avais le même problème hier.

Je suis donc passé au plan B --> le module 1.
Et là c'est le drame: dans excel, je crée une fausse macro et je viens y coller le text de module1.bas
quand j'execute :
J'ai une erreur de syntaxe sur la 1ere ligne :Attribute VB_Name = "Module1"

Pardonnez mon ignorance mais peut être comme vous avez dit "importez le module", y a-t-il une procédure d'importation que j'ignore.

en PJ, je mets un des fichiers pour lequel il faut extraire le contenu et le chemin du repertoire ( a renommer en .txt).
Nico
 

Pièces jointes

  • account.txt.xls
    1.3 KB · Affichages: 79

SubEndSub

XLDnaute Occasionnel
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Bonjour chez vous


Supprimes cette ligne
Attribute VB_Name = "Module1"

dans ce que tu as copié/collé


Pour importer un fichier bas

Aller dans Outils/Macros/Visual Basic Editor
Fichier/Importer et sélectionner Module1.bas

pour findstr

C:\Test>findstr /R /S "define" c:\Test\*.txt >>output.xls

Il faut adapter le chemin et l'extention php à la place de txt
 

hctad1

XLDnaute Junior
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

J'avais bien modifié mes chemins et type de fichiers mais bizarrement je n'arrive à rien avec findstr.
En revanche, maintenant que je sais importer une macro, j'ai pu jouer un peu.
Maintenant la seule difficulté est d'adapter la bete.
J'ai modifié les strings cherchées pour n'avoir que define
myStrings = Array("define")
modifié mon type de fichier cherché.
OK.
Cela nous donne deux questions :
1. comment afficher la ligne complète qui contient la chaine recherchée (au lieu d'afficher seulement la chaine recherchée).
2. Comme inclure les sous repertoires (car ils sont importants et on peut trouver deux fichiers portant le même nom dans 2 repertoires).

Merci d'avance.
Nicolas

PS: je vais qd mm rejouer un peu avec findstr car ça m'enerve d'avior une solution simple et de ne pas réussir a la faire tourner.
 

SubEndSub

XLDnaute Occasionnel
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Bonjour chez vous


Voici une autre macro (reprise d'un code de F. Sigonneau)
(qui prend en compte les sous-répertoires)

Importer le module

et changer le nom du dossier et modifier cette ligne
Code:
If Right(Fich.Name, 4) = ".txt" Then 'ici changer .txt en .php
avant de lancer la macro
 

Pièces jointes

  • hctad1.zip
    1.1 KB · Affichages: 67

hctad1

XLDnaute Junior
Re : Fusion de fichiers txt suivant le modele dir > malist.txt

Je vais jouer avec pour le fun. Merci beaucoup.
En tout état de cause, j'ai fait avec findstr. En fait mon erreur a été de vouloir parcourir les sous repertoires. C'était tellement long que je pensais avoir une pétouille quelque part dans mes commutateurs.
Donc j'ai fait a la mano, comme il n'y avait pas trop de sous repertoires.

Merci beaucoup pour votre aide.
Nicolas
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 070
Membres
103 454
dernier inscrit
Marion devaux