JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel istIch habe ein Skript, das eine Eingabeliste verwendet, um Dateien aus einem Verzeichnis abzurufen.Das Dateiformat ist ungewöhnlich, sodass einige Manipulationen erforderlich sind. Jede Datei ist etwa 60 MB groß, sodass der Import länger dauern kann, als mir lieb ist.Mein Problem ist, dass die meisten Dateien die gewünschte Kopfzeile in Zeile 15 haben, aber etwa 10 % der Dateien haben eine Kopfzeile, die irgendwo zwischen Zeile 10 und 14 liegen könnte, und das kann ich erst herausfinden, wenn ich die Datei öffne.
Meine aktuelle Lösung besteht darin, dass das Skript die ersten 20 Zeilen öffnet, nach der Zeile sucht, die die Überschriften enthält, und diese Zeilennummer einer Variablen zuweist, diesen dt schließt und dann erneut öffnet, aber die Variable als Überschrift und Variable + 1 als verwendet erste Linie.Es funktioniert, aber es bedeutet, dass ich diese Dateien zweimal öffne, wobei es sich bei einer davon nur um eine eingeschränkte Vorschau handelt.
1) Gibt es einen besseren Weg, dies zu tun?
2) Und während ich frage: Gibt es eine Möglichkeit, eine Tabelle zu importieren, aber nur die gewünschten Spalten basierend auf dem Namen zu importieren?Meine Dateien haben etwa 1000 Spalten und ich benötige davon nur etwa 15.
Betreff: JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel istIch glaube, Du hast recht; Möglicherweise müssen Sie parse() verwenden, um die Zeichenfolge in einen Ausdruck umzuwandeln.
Hier ist ein weiterer Ansatz, der Zeichenfolgen vermeidet und die Ausdrücke direkt manipuliert:
// testing data (I modified your end of field with a tab, below)
filelist = {"$sample_data\..\Import Data\bigclass.txt"};
x = 1;
// build an expression with a placeholder COLUMNSEXPR
openstmt = Expr(
Open(
FileList[x],
COLUMNSEXPR, // << placeholder for columns(...)
Import Settings( End Of Line( CRLF, CR, LF ), End Of Field( tab, CSV( 0 ) ),
Strip Quotes( 1 ), Column Names Start( 1 ), Data Starts( 1 ) )
)
);
// if you run the openstmt function now, it will import all the columns
//
// eval(openstmt);
// build a list using {} to make it easy to manipulate
COLUMNSLIST = {};
// insert the column you want to keep
Insert Into( COLUMNSLIST, Expr( New Column( "Col1", Character, "Nominal" ) ) );
// insert 5 omit columns...
For( i = 1, i < 5, i += 1,
Insert Into( COLUMNSLIST, Expr( Omitted Column( . ) ) )
);
// COLUMNSLIST looks like this:
//{New Column( "Col1", Character, "Nominal" ), Omitted Column( . ),
//Omitted Column( . ), Omitted Column( . ), Omitted Column( . )}
// convert the {...} to columns(...)
Substitute Into( COLUMNSLIST, Expr( {} ), Expr( columns ) );
//show(nameexpr(COLUMNSLIST)); shows this:
//columns(New Column("Col1", Character, "Nominal"),
//Omitted Column(.), Omitted Column(.),
//Omitted Column(.), Omitted Column(.))
//
// if you leave out the nameexpr() it will (try to) evaluate rather than
// retrieving the expression for display. columns() is not a function in
// JSL, so evaluating makes an error message.
// nameexpr(openstmt) still show COLUMNSEXPR. replace it:
Substitute Into( openstmt, Expr( COLUMNSEXPR ), Name Expr( COLUMNSLIST ) );
// nameexpr(openstmt) is now
//Open(
// FileList[x],
// columns(
// New Column( "Col1", Character, "Nominal" ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . )
// ),
// Import Settings(
// End Of Line( CRLF, CR, LF ),
// End Of Field( tab, CSV( 0 ) ),
// Strip Quotes( 1 ),
// Column Names Start( 1 ),
// Data Starts( 1 )
// )
//)
Eval( openstmt ); // reads just the first column of the tableSie könnten etwas Ähnliches auch tun, indem Sie Text statt Ausdrücke manipulieren und dann
eval(parse( " the text you built ") )
Verwenden Sie die Technik, mit der Sie sich am wohlsten fühlen. Die Bearbeitung der Ausdrücke führt zu einer geringfügigen Geschwindigkeitsverbesserung, die jedoch im Vergleich zum Lesen einer Datei von der Festplatte unbedeutend ist.
Beachten Sie, dass die letzte Anweisung oben immer noch vom Wert von X abhängt, um eine zu öffnende Datei auszuwählen, sodass der Ausdruck nicht neu erstellt werden muss.
Betreff: JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel ist@Craige_Hales
Ich suche nach einer Möglichkeit, den Code für den Import dieser CSV-ähnlichen Dateien zu kürzen.Ich habe einen Import, der jetzt etwa 1000 Spalten hat, und einen anderen mit etwa 360, und dieser durchläuft jetzt Hunderte von Dateien in einer Liste namens „FileList“.Ich möchte aus den oben genannten Gründen nur Spalte 1 importieren.Mein aktueller Code sieht so aus:
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
eval(columns(
New Column( "Col1", Character, "Nominal" ),
Omitted Column( . ),
Omitted Column( . ),
Omitted Column( . ), <FONT color="#FF0000">(repeated 400 times!)</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
//invisible
);Aber ich habe versucht herauszufinden, wie man einen Ausdruck vom Typ eval() verwendet, aber ich mache es nicht richtig.Ich habe den eval()-Ausdruck an verschiedenen Stellen ausprobiert, kann ihn aber scheinbar nicht verstehen.Ich bin neu bei eval().Ich denke, dass mein Problem möglicherweise darin besteht, dass meine Variable „Omit“ am Ende eine Zeichenfolge ist, aber in Anführungszeichen gesetzt wird?
<FONT color="#339966"> Omit</FONT> = repeat("Omitted Column( . ),",400)||"Omitted Column( . )";
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
<FONT color="#FF0000">eval(</FONT>columns(
New Column( "Col1", Character, "Nominal" ),
<FONT color="#339966">Omit</FONT><FONT color="#FF0000">);</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
);
Betreff: JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel istFreut mich, dass das hilft, scheint ein würdiger Wunschlistenpunkt zu sein.
Betreff: JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel istDanke Craige. Für den ersten Import, um die Zeile mit den Spaltenüberschriften zu erhalten, habe ich Ihren Rat befolgt und die Spalte „Auslassen“ für die Spalten 2 bis 1000 verwendet, sodass ich nur Spalte 1 mit 20 Zeilen importiere, mir das benötige, was ich brauche, und es dann schließe. Dann öffne ich die Datei erneut, verwende aber die Informationen aus dem ersten Teil der Schleife, um die Spaltenkopfzeile richtig auszuwählen.
Ich wünschte, es gäbe eine bessere Möglichkeit, bestimmte Spalten für den zweiten Teil der Schleife zu importieren. In meiner Situation ändern sich wahrscheinlich die Reihenfolge und die Menge der Spalten in meiner Roheingabedatei im Laufe der Zeit, ohne dass ich es weiß. Es wäre cool, wenn JMP die Möglichkeit hätte, nur die Spalten, die Sie importieren möchten, namentlich anzugeben.Betreff: JSL-Tabellenimport – Auswahl der richtigen Zeile als Überschriften, wenn die gewünschte Zeilennummer variabel ist1) Ich denke, zwei Importe sind wahrscheinlich der einfachste Weg und können schneller durchgeführt werden ...
2) Sie müssen mehr als nur die zu importierenden Spalten angeben, aber die Beschleunigung wird sich lohnen ...
use the text import wizard to mark the unwanted columnsuse the text import wizard to mark the unwanted columnsVerwenden Sie den Textimport-Assistenten, um die unerwünschten Spalten zu markieren
Grab the source script, it has the JSL to omit columnsGrab the source script, it has the JSL to omit columnsBesorgen Sie sich das Quellskript, es verfügt über die JSL zum Weglassen von Spalten
(Bei 1000 ausgelassenen Spalten ist es möglicherweise einfacher, die JSL zu bearbeiten, als sie mit der GUI auszuschließen.)
Jetzt können Sie das Quellskript optimieren. Darunter stehen die ersten 100 Zeilen. Es ist schnell, weil (1) alles über die Spalten angegeben ist und (2) es nach 100 Zeilen stoppt. Für diese Daten hätte ich Labels(0) und DataStarts(1) angeben sollen.
Open(
"f:\logOriginalAntenna.txt",// 100MB file takes about 2 seconds to load 100 lines
columns(
Omitted Column( . ),// use the import wizard to
Omitted Column( . ),// get a source script with
Omitted Column( . ),// omitted columns
New Column( "c000004",
Numeric,
"Continuous",
Format( "yyyy-mm-ddThh:mm:ss", 23, 3 ),
Input Format( "yyyy-mm-ddThh:mm:ss", 3 )
),
New Column( "c000005", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
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( 100 ),// specify the number of rows
Year Rule( "20xx" )
)
)
Wenn Ihre Dateien immer die gleiche Spaltenreihenfolge haben, bedeutet die explizite Angabe des Formats (oben), dass JMP die Datei vor dem Importieren nicht untersuchen muss. Ich denke, JMP studiert das immer noch gesamte selbst wenn Sie bei 100 Zeilen anhalten, könnte dies die Verarbeitungszeit erheblich verkürzen.
Wenn die Dateien nicht immer die gleiche Anzahl an Spalten oder die gleiche Reihenfolge der Spalten haben, funktioniert dies nicht. Möglicherweise können Sie die Tabelle importieren, die Spaltennamen und Datentypen korrigieren, nicht benötigte Zeilen löschen ... mit einem einzigen Import.