Header-Daten transponieren und Dateien verkettenIch habe eine Reihe von CSV-Rohdatendateien mit Metadaten im Header, die ich verketten und die Headerdaten in Spalten kopieren möchte. Ich konnte das Skript „combine txt tables.jsl“, das ich auf dieser Site gefunden habe, ändern, um die Header-Daten abzurufen, zu transponieren und mit der Rohdatentabelle zu verbinden. Die Kopfdaten sind in jeder Rohdatendatei in den Zeilen 2 bis 29 enthalten, und ich transponiere sie, um die erste Spalte in Spaltennamen und die zweite Spalte in die Metadaten umzuwandeln, die in jeder Rohdatenzeile dupliziert werden. Aus irgendeinem Grund wird nur die erste Datei eingelesen und die Importschleife nicht fortgesetzt. Mein Skript ist wie folgt:
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 loopIch denke, die Schleife stoppt wegen der Tabellenbenennung. Wenn ich „Close(Data Table(“Header table“),NoSave);“ auskommentiere. Das Skript importiert die erste Datei korrekt und stoppt dann. Wenn ich den Kommentar herausnehme, erhalte ich eine Datentabelle mit dem ersten Satz Rohdaten und Header-Daten, die wie erwartet importiert wurden, sowie den Rohdaten der zweiten Datendatei, in denen die Header-Daten fehlen. Es kommt nie über die zweite Datei hinaus. Hier ist ein Beispiel, das zeigt, wie die Rohdatendatei formatiert ist, mit Metadaten in den Zeilen 1 bis 3 und Rohdaten beginnend in Zeile 5:
| Testzyklus | 1 | | |
| Labor | Lab_A | | |
| Seriennummer | 123ABC | | |
| Zeit | Metrik A | Metrik B | Metrisches 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 |
Betreff: Header-Daten transponieren und Dateien verketten@mlipsitz
Ihre Dankesantwort ist kein geeigneter Eintrag, um als „Lösung“ gekennzeichnet zu werden.Die Leser müssen einen Hinweis auf die Antwort(en) haben, die tatsächlich die Lösung enthalten.Bitte wählen Sie die Antwort(en) aus, die die Lösung(en) zeigen.
Betreff: Header-Daten transponieren und Dateien verkettenVielen Dank ian_jmp Und gzmorgan0 . Ich stimme zu, dass ich Probleme mit der Syntax hatte und versuchte, Code aus verschiedenen Quellen zu kombinieren. Ich konnte es bekommen gzmorgan0 Der Code von 's funktioniert mit einigen geringfügigen Anpassungen. Siehe das beigefügte Skript. Ja, alle meine Dateien werden von einem automatisierten Datenerfassungssystem identisch formatiert. Nochmals vielen Dank für Ihre Hilfe dabei und für die Syntaxlektion!
Betreff: Header-Daten transponieren und Dateien verkettenKein Problem – Einer meiner vielen Fehler ist, dass es mir schwerfällt, mit dem Code von jemand anderem zu arbeiten
. . .
Betreff: Header-Daten transponieren und Dateien verkettenEntschuldigung @ian_jmp , Sie müssen Ihr Skript gepostet haben, während ich den Beitrag bearbeitet habe.
Betreff: Header-Daten transponieren und Dateien verketten@mlipsitz , es gibt mehrere Probleme mit diesem Skript. Ich denke, Sie müssen mehr Arbeit leisten, um die grundlegende JSL-Syntax zu erlernen.Ja, wir alle lernen eine Sprache, indem wir bereits geschriebenen Code nehmen und ihn modifizieren, aber Sie benötigen einige Grundlagen.Dieser Teil Ihres Skripts sieht beispielsweise so aus, als hätten Sie versucht, die Tabelle dt umzubenennen. Es gibt keine Stelle in Ihrem Code, an der eine Spalte ::TTV0.000000 definiert ist, und diese würde transponieren nicht Mach, was ich glaube, dass du getan werden willst.
//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" )
);
Wenn der folgende Code ausgeführt wird, ist dt außerdem die Tabelle der Rohdatenwerte vor dem kartesischen Join und dtjoined die Wertetabelle mit den Beschriftungen. Sie überschreiben Tabellen (Namenskollisionen).
//add the current table to the bottom of the combined data table
dtjoined << Concatenate( Data Table( dt ), Append to first table );
Hier ein paar Vorschläge:
- Machen Sie Tabellen erst dann privat, wenn Ihr Skript geschrieben ist und ordnungsgemäß ausgeführt wird.
- dt ist nur eine Abkürzung für eine Tabellenreferenz. Es ist in Ordnung, einen Variablennamen wiederzuverwenden (umzuwidmen), ich empfehle dies jedoch nicht für eine Tabelle, bis die frühere Tabelle geschlossen ist. Verwenden Sie beispielsweise Variablennamen, die den Code besser lesbar machen dthdr für die Header-Tabelle und dtx für die transponierte Tabelle.
- Schließen Sie den Tisch, sobald sie nicht mehr benötigt werden.
- Willst du das wirklich? Dateien verbinden oder verketten Dateien? Wenn jede Datei die gleichen Metriken hat, dann denke ich, dass Sie eine Verkettung wünschen.
- Testen Sie Ihr Skript mit ein paar Dateien. Mit anderen Worten: Lernen Sie, wie Sie einen Basehit erzielen, bevor Sie sich auf die Fences stürzen.
Ihre Leseanweisungen waren für Ihre Beispieltabelle nicht sinnvoll.Sind Sie sicher, dass alle Dateien das gleiche Format haben?Oder müssen Sie nach einem Muster suchen, um festzustellen, wo die Rohdaten beginnen?Dieses Skript funktioniert, wenn die Dateiformate festgelegt sind. Die Anzahl der Rohdatenzeilen kann sich ändern.Beachten Sie, dass ich die Liste der zu testenden Dateien fest codiert habe. Der Code zum Abrufen der Dateien sieht in Ordnung aus.
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");
Ich habe dieses Skript mit der von Ihnen angezeigten Datei und einer Änderung dieser Datei getestet. Hier ist das Ergebnis mit dem obigen Skript.

Betreff: Header-Daten transponieren und Dateien verkettenUnter Verwendung des Formats am Ende Ihrer Nachricht finden Sie hier einen Code, der CSV-Dateien auf dem Desktop (eines Mac) verarbeitet.
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");