Die von der Webseite heruntergeladene TXT-Datei enthält Daten. Wie kann ich JSL verwenden, um eine solche TXT-Datei als Tabellendaten zu verarbeiten?
Ich komme mit JSON nicht zurecht. Danke, Experten!

// the U.txt file has 2 extra characters at the
// start and 3 extra characters at the end.
// visual inspection is the only way I know to
// figure that out.
// using JMP 15's json wizard
x = Load Text File( "E:/U.txt" );
x = Substr( x, 3, Length( x ) - 5 );
Open( Char To Blob( x ), jsonwizard( 0 ) );
// using JMP 14's basic json support
x = Load Text File( "E:/U.txt" );
x = Substr( x, 3, Length( x ) - 5 );
Open( Char To Blob( x ), "json" );
Wenn Sie JMP 15 haben, können Sie den Assistenten auch interaktiv verwenden (verwenden Sie JsonWizard(1), um die GUI anzuzeigen).Es braucht noch Hilfe beim Entfernen der zusätzlichen Zeichen.Die obige JSL lädt den Text in x, entfernt die 2 und 3 Zeichen mit substr() und übergibt die Daten dann über einen Blob an open(), ohne sie erneut auf die Festplatte zu schreiben. Wenn Sie auf die Festplatte umschreiben, können Sie die Erweiterung auch in .json ändern.
JMP 15's wizard also guesses the datatypes better in this exampleJMP 15's wizard also guesses the datatypes better in this exampleDer Assistent von JMP 15 errät die Datentypen in diesem Beispiel auch besser
@davidbarbour
Nein, Sie haben Recht. Ich habe zwei Stunden damit verbracht, ein Skript basierend auf meinem Ansatz zu schreiben, und bin dabei auf viele mühsame Probleme gestoßen. Ich habe jetzt keine Zeit mehr.
Hallo lwx228,
Unten finden Sie ein Skript, das die Daten importiert, entsprechend umcodiert, Texte in Spalten einfügt, stapelt und aufteilt, um die endgültige Tabelle zu erhalten.
Einige Anmerkungen, da dies ein ziemlich seltsames Datenformat ist:
- Es gibt Inkonsistenzen bei den Trennzeichen und im Vergleich zu üblichen TXT-Dateien:
- Komma wird in den Feldern und als Trennzeichen verwendet,
- Anführungszeichen werden ebenfalls verwendet, jedoch nicht für jedes Element.
- Klammern werden auf verschiedene Arten verwendet
- Manchmal gibt es eine „Null“-Anweisung für einen fehlenden Wert, manchmal aber auch nicht!
- Es gibt keine erste Zeile mit Spaltennamen, sie befinden sich innerhalb der Datenfelder. Das macht es notwendig, diese zu extrahieren und den Stapel-/Split-Vorgang durchzuführen, um die Spalten so zu erhalten, wie Sie sie für die Analyse benötigen (vielleicht hat jemand einen einfacheren Ansatz – würde mich freuen, davon zu hören
)
- Die Standardeinstellungen funktionieren daher nicht, da Sie eine falsche Anzahl von Feldern pro Zeile erhalten!
- Am besten lesen Sie die gesamte Zeichenfolge pro Zeile ein und erledigen den Rest in JMP mithilfe von Recode- und Spaltendienstprogrammen. Hoffentlich können diese auch mit einer ähnlichen Datei verwendet werden.
- Um diese Dinge zu skripten, müssen Sie jeden Schritt testen. Wenn der Schritt in Ordnung zu sein scheint, speichern/kopieren Sie das Skript in einem Skriptfenster und führen Sie den nächsten Schritt aus.
- So ist das folgende Skript entstanden.
Names Default to Here(1);
//Open your txt file using special settings, like } as end of line, uncheck column names, data starts row 1, ...
dt = Open(
"YOURPATH\U.txt", // exchange YOURPATH with your path to the file
columns( New Column( "c000001", Character, "Nominal" ) ),
Import Settings(
End Of Line( Semicolon, Other( "}" ) ),
End Of Field( 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( 1 ),
Data Starts( 1 ),
Lines To Read( "All" ),
Year Rule( "20xx" )
)
);
// Now you have one column with in each row all information after "name"
// Remove last two lines as they are just filled with brackets
dt << Clear Selected Row States;
m = matrix({N Rows(dt)-1, N Rows(dt)});
dt << Select Rows( m);
wait(2);
dt << Delete Rows();
// Best to use Recode and Column utility functions to seperate all information
dt << New Column("recoded","Character",Formula(Recode(
:c000001,
{Substitute( _rcNow, ",{", "" ), Substitute( _rcNow, "({[{", "" ),
Substitute( _rcNow, ":", "," ), Substitute( _rcNow, "\!",\!"", ";" ),
Substitute( _rcNow, ";;", ";null;" ),
Substitute( _rcNow, "\!"", "" ), Substitute( _rcNow, ",null,", ";null;" ),
Substitute( _rcNow, ",null", ";null" )
}
)));
// Get all text seperated by ; in seperated columns
dt << Text To Columns( delimiter( ";" ), columns( :recoded ) );
dt << Delete Columns(Column(1),Column(2));
// Now you have to stack the data appropriately
colNames = dt << Get Column Names();
dt_stack = dt << Stack(
Columns(colNames),
Source Label Column( "ColName" ),
Stacked Data Column( "Data" ),
Number of Series( 2 )
);
dt_stack << Delete Columns(1,3);
// Just to Split it again to get the columns with the correct names as well the data respectively
dt_final = dt_stack << Split(
Split By( :Data ),
Split( :Data 2 ),
Sort by Column Property
);
// Close data tables you do not need anymore
close(dt_stack, NoSave);
close(dt, NoSave);
// Finally you get an alphabetic order and all data is in character. So you now need to change this appropriately.
Es hat Spaß gemacht, das durchzuarbeiten, aber es hat einige Zeit gedauert, bis wir die oben beschriebenen seltsamen Datenherausforderungen gemeistert haben. Allerdings aufgrund der eingebauten Skripte und Formeln nicht zu viel 
Noch ein Tipp: Um die Recode-Formeln zu erhalten, verwenden Sie Recode und speichern Sie sie als Formelspalte, schauen Sie in den Formeleditor und los geht's.
Am besten,
Martin
Erstellen Sie eine Datentabelle mit den erforderlichen Datenspalten (z. B. „name“, „cname“ usw.). Es gibt überflüssige Zäune „({[“ am Anfang und „]})“ am Ende dieser Daten. Ersetzen Sie „{“ und „}“, sodass Sie eine einfache Liste mit Unterlisten erhalten. Anschließend wird die Liste durchlaufen und die Unterlisten einzeln verarbeitet. Der Variable, Wert Paare haben eine einfache Reihenfolge, sodass Sie der Datentabelle jeweils eine Zeile hinzufügen können.
Ich habe jetzt keine Zeit, ein einfaches Skript zu schreiben, um diesen Ansatz zu demonstrieren.