Il file txt scaricato dalla pagina Web, questo file contiene dati, come utilizzare JSL per elaborare tale file txt come dati tabulari?
Non riesco a gestirlo con JSON.Grazie agli esperti!

// 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" );
Se hai JMP 15, puoi anche utilizzare la procedura guidata in modo interattivo (usa JsonWizard(1) per visualizzare la GUI).Ha ancora bisogno di aiuto per rimuovere i caratteri extra.Il JSL sopra carica il txt in x, rimuove i caratteri 2 e 3 con substr(), quindi passa i dati a open(), tramite un blob, senza riscrivere su disco. Se riscrivi su disco, puoi anche modificare l'estensione in .json.
JMP 15's wizard also guesses the datatypes better in this exampleJMP 15's wizard also guesses the datatypes better in this exampleAnche la procedura guidata di JMP 15 indovina meglio i tipi di dati in questo esempio
@davidbarbour
No, hai ragione. Ho passato due ore a scrivere una sceneggiatura basata sul mio approccio e mi sono imbattuto in molti noiosi problemi. Non ho più tempo adesso.
Ciao lwx228,
Di seguito troverai uno script che importerà i dati, ricodificherà in modo appropriato, inserirà il testo in colonne, impilerà, dividerà per ottenere la tabella finale.
Alcune osservazioni in quanto questo è un formato di dati piuttosto strano:
- c'è incoerenza con i delimitatori e rispetto ai soliti file txt:
- la virgola è usata nei campi e come separatore,
- si usano anche le virgolette, ma non per ogni elemento,
- le parentesi sono utilizzate in diversi modi
- A volte c'è un'istruzione 'null' per un valore mancante, ma a volte no!
- Non esiste una prima riga con i nomi delle colonne, sono all'interno dei campi dati. Ciò rende necessario estrarli ed eseguire l'operazione stack/split per ottenere le colonne necessarie per l'analisi (potrebbe che qualcuno abbia un approccio più semplice - sarebbe il benvenuto a saperlo;) )
- le impostazioni predefinite non funzioneranno quindi poiché otterrai un numero errato di campi per riga!
- La cosa migliore è leggere l'intera stringa per riga e fare il resto in JMP usando ricodifica e utilità di colonna. Si spera che questi possano essere utilizzati anche con un file simile.
- Per scrivere queste cose devi testare ogni passaggio e se il passaggio sembra essere ok, salva/copia lo script in una finestra di script ed esegui il passaggio successivo.
- Ecco come è stato creato lo script qui sotto.
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.
È stato divertente affrontarlo, ma ci è voluto del tempo per superare le strane sfide relative ai dati sopra descritte. Tuttavia, a causa degli script e delle formule integrati non troppo 
Un altro consiglio: per ottenere le formule di ricodifica, usa la ricodifica e salvala come colonna della formula, guarda nell'editor delle formule e il gioco è fatto.
Migliore,
Martino
Crea una tabella di dati con le colonne di dati necessarie (ad es. "name", "cname" e così via). Ci sono barriere estranee "({[" all'inizio e "]})" alla fine di questi dati. Sostituisci "{" e "}" in modo da avere un semplice elenco di sottoelenchi. Quindi scorrere l'elenco ed elaborare i sottoelenchi uno alla volta. IL variabile, valore le coppie sono in un ordine semplice in modo da poter aggiungere una riga alla volta alla tabella dati.
Non ho tempo ora per scrivere un semplice script per dimostrare questo approccio.