cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Try the Materials Informatics Toolkit, which is designed to easily handle SMILES data. This and other helpful add-ins are available in the JMP® Marketplace
Choose Language Hide Translation Bar
hcarr01
Level VI

Joindre fichiers textes

Bonjour à tous,

 

J’ai un dossier qui contient 2800 fichiers textes. Chaque fichier texte possède 3 colonnes. J’aimerais pouvoir joindre tous ces fichiers textes dans un seul fichier JMP (en réalisant une jointure par numéro de ligne), ce fichier JMP possèderait donc 2800*3 colonnes.

 

Remarques :

Avant la jointure de tous les fichiers, il faudrait rajouter des titres sur les colonnes de chaque fichier.

Titre colonne 1 : x-nomdufichier

Titre colonne 2 : y-nomdufichier

Titre colonne 3 : valeur-nomdufichier

Avec « nomdufichier » qui correspond au nom du fichier que l’on ouvre.

 

J’arrive à récupérer le nom du dossier et tous les noms des fichiers textes à ouvrir dans ce dossier avec le code suivant :

 

// Chemin du répertoire contenant les fichiers textes
chemin_du_repertoire = "chemin\du\dossier";


// Parcourir le répertoire et obtenir les noms des fichiers
noms_fichier = Files In Directory(chemin_du_repertoire, "\*.txt");

Mais après je n’ai pas de point de départ pour la suite.

Merci pour votre aide et vos réponses !

 

 

1 ACCEPTED SOLUTION

Accepted Solutions
hcarr01
Level VI

Re: Joindre fichiers textes

J'ai écris le script ci-dessous qui fonctionne bien mais il est très long à l'exécution pour 2800 fichiers.

 

Names Default To Here( 1 );

// Début de la mesure du temps
start=tick seconds();


// Chemin du dossier contenant les fichiers texte
dossier = "...";

// Obtenir la liste de tous les fichiers dans le dossier
listeFichiers = Files In Directory(dossier);



For ( i = 1 , i <= 2862 , i++,
	Names Default To Here( 1 );
	if( i == 1,
		fichierCourant = dossier || listeFichiers[1];
		fichierCourant1 = dossier || listeFichiers[Num(i+1)];
		dt = Open(fichierCourant);
		dt1 = Open(fichierCourant1);

		dt << Join(
			With( dt1 ),
			By Row Number,
			Output Table( "Sans titre.jmp" )
		);
		Close(dt,NoSave);
		Close(dt1,NoSave);
		dt = current data table();
		,
		
		dt = current data table();
		fichierCourant1 = dossier || listeFichiers[Num(i+1)];
		dt1 = Open(fichierCourant1);
		dt << Join(
			With( dt1 ),
			By Row Number,
			Output Table( "Sans titre.jmp" )
		);
		Close(dt,NoSave);
		Close(dt1,NoSave);
		
	);
	
);

end=tick seconds();
runtime=end-start;
durée=runtime/60;
result=(Char("La durée est de ")||Char(durée,5) || " "||Char("minutes"));
show(result);

Merci pour votre aide !

View solution in original post

4 REPLIES 4
jthi
Super User

Re: Joindre fichiers textes

To get a good starting point: perform the action for one pair of files interactively with JMP and then copy the script from Enhanced Log. Then you can start modifying that JMP created script to work in your script much more easily.

-Jarmo
hcarr01
Level VI

Re: Joindre fichiers textes

J'ai réussi à écrire un script qui permet de transformer les fichiers textes en fichiers JMP avec les bons titres des colonnes.

Cependant pour effectuer la jointure en ligne de tous ces fichiers, c'est plus difficile.

 

J'ai essayé avec le script suivant :

 

// Chemin du dossier contenant les fichiers texte
dossier = "......";

// Obtenir la liste de tous les fichiers dans le dossier
listeFichiers = Files In Directory(dossier);



// Créer une nouvelle table pour stocker les données combinées
table = New Table("Data Table");

// Boucle pour charger et combiner les fichiers
for (i = 1, i <= N Items(listeFichiers), i++,
    fichierCourant = dossier || listeFichiers[i];
    
    dt = Open(fichierCourant);
    
    // Ajouter les colonnes du fichier courant à la table combinée
    table << Join(With(dt),By Row Number);
    
    // Fermer le fichier courant
    Close(dt, NoSave);
);
jthi
Super User

Re: Joindre fichiers textes

With join you are most likely always creating a new table so you would have to also handle that. Other option is to use Update instead

Names Default To Here(1);

dt = New Table("Untitled",
	Add Rows(3),
	Compress File When Saved(1),
	New Column("A1", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3]))
);

dt1 = New Table("Untitled 2",
	Add Rows(3),
	Compress File When Saved(1),
	New Column("B1", Numeric, "Continuous", Format("Best", 12), Set Values([4, 5, 6]))
);

wait(1);

dt << Update(
	With(Data Table("Untitled 2")),
	Replace Columns in Main Table(None)
);
Close(dt1, no save);

(try this also first with the interactive option)

-Jarmo
hcarr01
Level VI

Re: Joindre fichiers textes

J'ai écris le script ci-dessous qui fonctionne bien mais il est très long à l'exécution pour 2800 fichiers.

 

Names Default To Here( 1 );

// Début de la mesure du temps
start=tick seconds();


// Chemin du dossier contenant les fichiers texte
dossier = "...";

// Obtenir la liste de tous les fichiers dans le dossier
listeFichiers = Files In Directory(dossier);



For ( i = 1 , i <= 2862 , i++,
	Names Default To Here( 1 );
	if( i == 1,
		fichierCourant = dossier || listeFichiers[1];
		fichierCourant1 = dossier || listeFichiers[Num(i+1)];
		dt = Open(fichierCourant);
		dt1 = Open(fichierCourant1);

		dt << Join(
			With( dt1 ),
			By Row Number,
			Output Table( "Sans titre.jmp" )
		);
		Close(dt,NoSave);
		Close(dt1,NoSave);
		dt = current data table();
		,
		
		dt = current data table();
		fichierCourant1 = dossier || listeFichiers[Num(i+1)];
		dt1 = Open(fichierCourant1);
		dt << Join(
			With( dt1 ),
			By Row Number,
			Output Table( "Sans titre.jmp" )
		);
		Close(dt,NoSave);
		Close(dt1,NoSave);
		
	);
	
);

end=tick seconds();
runtime=end-start;
durée=runtime/60;
result=(Char("La durée est de ")||Char(durée,5) || " "||Char("minutes"));
show(result);

Merci pour votre aide !