Die von der Webseite heruntergeladene TXT-Datei, diese Datei enthält Daten, wie verwendet man JSL, um eine solche TXT-Datei als tabellarische Daten zu verarbeiten?
Ich kann es nicht mit JSON handhaben. 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 über JMP 15 verfügen, können Sie den Assistenten auch interaktiv verwenden (verwenden Sie JsonWizard(1), um die GUI anzuzeigen.)Es muss noch geholfen werden, die zusätzlichen Zeichen zu entfernen.Die obige JSL lädt die txt-Datei in x, entfernt die Zeichen 2 und 3 mit substr() und übergibt die Daten dann über ein Blob an open(), ohne sie neu auf die Festplatte zu schreiben. Wenn Sie auf die Festplatte umschreiben, können Sie auch die Erweiterung in .json ändern.
JMP 15's wizard also guesses the datatypes better in this exampleDer Assistent von JMP 15 errät in diesem Beispiel auch die Datentypen besser
@DavidBarbour
Nein, du hast Recht. Ich habe zwei Stunden damit verbracht, ein Skript zu schreiben, das auf meinem Ansatz basiert, und bin dabei auf viele lästige Probleme gestoßen. Ich habe jetzt keine Zeit mehr.
Hallo lwx228,
Unten finden Sie ein Skript, das die Daten importiert, entsprechend umcodiert, Text 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 eine Inkonsistenz mit den Trennzeichen und im Vergleich zu üblichen txt-Dateien:
- Komma wird in den Feldern und als Trennzeichen verwendet,
- Anführungszeichen werden ebenfalls verwendet, aber nicht für jedes Element,
- Klammern werden auf verschiedene Weise verwendet
- Manchmal gibt es eine 'Null'-Anweisung für einen fehlenden Wert, aber manchmal nicht!
- Es gibt keine erste Zeile mit Spaltennamen, sie befinden sich innerhalb der Datenfelder. Das macht es notwendig, diese zu extrahieren und die Stack/Split-Operation 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 gerne davon 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 mit 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 und wenn der Schritt in Ordnung zu sein scheint, speichern/kopieren Sie das Skript in ein Skriptfenster und führen Sie den nächsten Schritt aus.
- So wurde das folgende Skript erstellt.
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, dies durchzugehen, aber es dauerte einige Zeit, um die oben beschriebenen seltsamen Datenherausforderungen zu überwinden. Aufgrund der eingebauten Skripte und Formeln jedoch nicht zu viel 
Noch ein Tipp: Um die Recode-Formeln zu erhalten, verwenden Sie recode und speichern Sie es 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 von Unterlisten haben. Iterieren Sie dann über die Liste und verarbeiten Sie die Unterlisten nacheinander. Die Variable, Wert Paare sind in einer einfachen Reihenfolge, sodass Sie jeweils eine Zeile zur Datentabelle hinzufügen können.
Ich habe jetzt keine Zeit, ein einfaches Skript zu schreiben, um diesen Ansatz zu demonstrieren.