Transposer les données d'en-tête et concaténer les fichiersJ'ai un ensemble de fichiers csv de données brutes avec des métadonnées dans l'en-tête que je veux concaténer et copier les données d'en-tête dans des colonnes. J'ai pu modifier le script "combine txt tables.jsl" que j'ai trouvé sur ce site pour extraire les données d'en-tête, les transposer et les joindre à la table de données brutes. Les données d'en-tête sont contenues dans chaque fichier de données brutes sur les lignes 2 à 29, et je les transpose pour transformer la première colonne en noms de colonne et la deuxième colonne en métadonnées, dupliquées dans chaque ligne de données brutes. Pour une raison quelconque, il ne tire que le premier fichier et ne continue pas la boucle d'importation. Mon script est le suivant :
names default to here (1);
Clear Symbols();
//set up variables with starting values
filelist={}; //empty list
//launch dialog to get the file location
prefilepath = munger(Pick Directory( "Browse to the Directory of the .txt / .csv files " ),1,"/","");
filepath = Convert File Path( prefilepath, Windows );
prefilelist = Files In Directory( filepath );
n2=nitems(prefilelist);
//filter out any non-txt or csv files
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
// changed from item 2 to item -1
If( Item( -1, prefilelist[i2], "." ) == "txt" | Item( -1, prefilelist[i2], "." ) == "csv",
Insert Into( filelist,file),
show(file)
)
);
//filter out any non-Excel files for the file list.
For( i2 = 1, n2 >= i2, i2++,
file=(prefilelist[i2]);
If( Item( -1, prefilelist[i2], "." ) == "xls" | Item( -1, prefilelist[i2], "." ) == "xlsx",
Insert Into( filelist,file),
show(file)
)
);
//Create raw data table:
nf=nitems(filelist); //number of items in the working list
For( iii = 1 , iii <= nf, iii++, //this starts the first loop
filenow = ( filelist[iii] );
fileopen=(filepath||filenow);
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( 29 ),
Year Rule( "20xx" )
)
);
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 32 ),
Data Starts( 33 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge header table with raw data into "Combined Data Table"
dtjoined=dt<< Join(
With( Data Table( "Transposed Header table" ) ),
Cartesian Join
);
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
dtjoined << Set Name("Combined Data Table");
Close(Data Table("Transposed Header table"),NoSave);
Close(Data Table("Header table"),NoSave);
dt << Run Formulas();
);//end of the first for loopJe pense que la boucle s'arrête à cause de la dénomination de la table. Si je commente le "Close(Data Table("Header table"),NoSave);" script, il importe correctement le premier fichier puis s'arrête. Si je supprime le commentaire, j'obtiens une table de données avec le premier ensemble de données brutes et de données d'en-tête importées comme prévu, plus la valeur des données brutes du deuxième fichier de données manquant les données d'en-tête. Il ne dépasse jamais ce deuxième fichier. Voici un exemple montrant comment le fichier de données brutes est formaté, avec des métadonnées sur les lignes 1 à 3 et des données brutes commençant sur la ligne 5 :
| Cycle d'essai | 1 | | |
| Laboratoire | Labo_A | | |
| Numéro de série | 123ABC | | |
| Temps | Métrique A | Métrique B | Métrique C |
| 1 | 1 | 70 | 60 |
| 2 | .1 | 71 | 61.1 |
| 3 | .2 | 73 | 62,5 |
| 4 | .3 | 78 | 63,8 |
| 5 | .4 | 80 | 65,7 |
| 6 | .5 | 85 | 69.2 |
| 7 | .6 | 89 | 72.3 |
Re : Transposer les données d'en-tête et concaténer les fichiers@mlipsitz
Votre réponse de remerciement n'est pas une entrée appropriée pour être étiquetée comme "Solution".Les lecteurs doivent avoir un pointeur vers la ou les réponses qui contiennent réellement la solution.Veuillez sélectionner la ou les réponses qui montrent la ou les solutions.
Re : Transposer les données d'en-tête et concaténer les fichiersMerci beaucoup ian_jmp et gzmorgan0 . Je suis d'accord que j'avais du mal avec une partie de la syntaxe et que j'essayais de combiner du code provenant de diverses sources. j'ai pu obtenir gzmorgan0 de fonctionner avec quelques légers ajustements. Voir le script ci-joint. Oui, tous mes fichiers sont formatés à l'identique à partir d'un système d'acquisition de données automatisé. Merci encore pour votre aide et pour la leçon de syntaxe !
Re : Transposer les données d'en-tête et concaténer les fichiersPas de problème - L'un de mes nombreux défauts est que j'ai du mal à travailler avec le code de quelqu'un d'autre
. . .
Re : Transposer les données d'en-tête et concaténer les fichiersDésolé @ian_jmp , vous devez avoir posté votre script pendant que j'éditais le message.
Re : Transposer les données d'en-tête et concaténer les fichiers@mlipsitz , il y a plusieurs problèmes avec ce script. Je pense que vous devez faire plus de travail pour apprendre la syntaxe JSL de base.Oui, nous apprenons tous un langage en prenant du code déjà écrit et en le modifiant, mais vous avez besoin de quelques bases.Par exemple, cette partie de votre script donne l'impression que vous essayez de renommer la table dt. Il n'y a aucun endroit dans votre code où il y a une colonne :: TTV0.000000 est définie, et cette transposition serait pas fais ce que je pense que tu veux faire.
//Transpose header data into new columns and create "Transposed Header Table"
dt<<( "Header table" ) << Transpose(
columns( :TTV0.000000 ),
Label( :Name( "Test Name:" ) ),
Output Table( "Transposed Header table" )
);
De plus, lorsque le code ci-dessous est exécuté, dt est le tableau des valeurs de données brutes avant la jointure cartésienne et dtjoined est le tableau des valeurs avec les étiquettes. Vous écrasez des tables (collisions de noms).
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
Voici quelques suggestions :
- Ne rendez pas les tables privées tant que votre script n'est pas écrit et ne s'exécute pas correctement.
- dt est juste un raccourci pour une référence de table. Il est acceptable de réutiliser (réutiliser) un nom de variable, mais je ne le recommande pas pour une table tant que la table précédente n'est pas fermée. Utilisez des noms de variables qui rendent le code plus lisible, par exemple dthdr pour le tableau d'en-tête et dtx pour le tableau transposé.
- Fermez la table dès qu'ils ne sont plus nécessaires.
- Voulez-vous vraiment joindre des fichiers ou enchaîner des dossiers? Si chaque fichier a les mêmes métriques, alors je pense que vous voulez concaténer.
- Testez votre script avec quelques fichiers. En d'autres termes, apprenez à obtenir un coup de base avant de vous balancer vers les clôtures.
Vos instructions de lecture n'avaient pas de sens pour votre exemple de table.Êtes-vous sûr que chacun des fichiers a le même format ?Ou avez-vous besoin de rechercher un modèle pour déterminer où commencent les données brutes ?Ce script fonctionnera si les formats de fichiers sont fixes. Le nombre de lignes de données brutes peut changer.Remarque, j'ai codé en dur la liste des fichiers à tester. Le code pour obtenir les fichiers semble correct.
Names default to Here(1);
filelist = {"example1_20190214.txt", "example2_20190214.txt"};
filepath = "c:\temp\";
df = nitems(filelist);
for(iii=1, iii<=df, iii++,
filenow = filelist[iii];
fileopen=(filepath||filenow);
dthdr=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels(0 ),
Column Names Start(0 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
)
);
nc = ncol(dthdr);
dthdr << Combine Columns( Delimiter(" "), Columns(2::nc), Column Name("Info") );
dthdr << delete columns(3::nc);
//Transpose header data into new columns and create "Transposed Header Table"
dthdr<< set name( "Header table" );
dtx = dthdr << Transpose(
columns( :Info ),
Label( Column(1) ),
Output Table( "Transposed Header table" )
);
dtx << delete column (:Label);
//Close Header table
Close(dthdr,Nosave);
//New Column( "Source", Character, Nominal );
//:Source << set each value( filenow );
dt=open(fileopen,//private,
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
New Column( "Source", Character, Nominal );
:Source << set each value( filenow );
//Merge Transposed Header table, dtx, with raw data table, dt
dtjoined=dt<< Join(
With( dtx ),
Cartesian Join
);
//close Transposed Header table
Close(dtx, NoSave);
//close raw data table, dt
Close(dt, NoSave);
//For the first file, keep it, it will be used to append other file
//For the other files, append then close
If (iii==1 , dtfinal = dtjoined,
//else
current data table(dtfinal);
dtfinal << Concatenate( dtjoined , Append to first table(1));
wait(0);
close(dtjoined, NoSave)
);
//no need for Run Formulas() there are no formulas in the table
); //end the for iii loop
//Give the final table a name
dtfinal << set name( "Combined Data Table");
J'ai testé ce script en utilisant le fichier que vous avez affiché et une modification de ce fichier. Voici le résultat en utilisant le script ci-dessus.

Re : Transposer les données d'en-tête et concaténer les fichiersEn utilisant le format au bas de votre message, voici un code qui traitera les fichiers .CSV sur le bureau (d'un Mac)
NamesDefaultToHere(1);
// Get a list of .csv files on the desktop
fileList = FilesInDirectory("$DESKTOP");
for(f=NItems(fileList), f>=1, f--, If(!EndsWith(Uppercase(fileList[f]), ".CSV"), RemoveFrom(fileList, f)));
fileList;
// Process each .csv file
For(f=1, f<=NItems(fileList), f++,
// Get metadata (generated by JMP)
dtm = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Name", Character, "Nominal" ),
New Column( "Value", Character, "Nominal" ),
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 0 ),
Column Names Start( 1 ),
Data Starts( 1 ),
Lines To Read( 3 ),
Year Rule( "20xx" )
),
Invisible
);
// Get data (generated by JMP)
dtd = Open(
"$DESKTOP/"||fileList[f],
columns(
New Column( "Time", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Meric A", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric B", Numeric, "Continuous", Format( "Best", 12 ) ),
New Column( "Metric C", Numeric, "Continuous", Format( "Best", 12 ) )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Comma, CSV( 0 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 4 ),
Data Starts( 5 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
),
Invisible
);
// Add the values from dtm to dtd
for (c=1, c<=NRow(dtm), c++,
vals = {}; for(r=1, r<=NRow(dtd), r++, InsertInto(vals, Column(dtm, 2)[c]));
dtd << newColumn(Column(dtm, 1)[c], Character, Values(vals));
);
Close(dtm, NoSave);
// Append tables
if(f==1,
dtFinal = Eval(dtd << GetScript),
dtFinal << Concatenate(dtd, AppendToFirstTable);
);
Close(dtd, NoSave);
);
// Tidy up dtFinal
dtFinal << ShowWindow(1);
dtFinal << setName("Final Data");
dtFinal << deleteProperty("Source");