El archivo txt descargado de la página web, este archivo tiene datos, ¿cómo usar JSL para procesar dicho archivo txt como datos tabulares?
No puedo manejarlo con JSON. ¡Gracias a los expertos!

// 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" );
Si tiene JMP 15, también puede usar el asistente de forma interactiva (use JsonWizard(1) para ver la GUI).Todavía necesita ayuda para eliminar los caracteres adicionales.El JSL anterior carga el txt en x, elimina los caracteres 2 y 3 con substr(), luego pasa los datos a open(), a través de un blob, sin volver a escribir en el disco. Si vuelve a escribir en el disco, también puede cambiar la extensión a .json.
JMP 15's wizard also guesses the datatypes better in this exampleEl asistente de JMP 15 también adivina mejor los tipos de datos en este ejemplo
@davidbarbour
No, tienes razón. Pasé dos horas escribiendo un guión basado en mi enfoque y me encontré con muchos problemas tediosos. No tengo más tiempo ahora.
Hola lwx228,
A continuación, encontrará un script que importará los datos, los recodificará adecuadamente, pondrá el texto en columnas, apilará y dividirá para obtener la tabla final.
Algunas observaciones ya que este es un formato de datos bastante extraño:
- hay inconsistencia con los delimitadores y en comparación con los archivos txt habituales:
- la coma se usa en los campos y como separador,
- también se utilizan comillas, pero no para cada elemento,
- los corchetes se usan de varias maneras
- A veces hay una declaración 'nula' para un valor faltante, ¡pero a veces no!
- No hay una primera fila con nombres de columna, están dentro de los campos de datos. Eso hace que sea necesario extraerlos y realizar la operación de apilar/dividir para obtener las columnas tal como las necesita para el análisis (puede que alguien tenga un enfoque más fácil, sería bienvenido saberlo;) )
- ¡La configuración predeterminada no funcionará, por lo tanto, obtendrá un número incorrecto de campos por fila!
- Lo mejor es leer la cadena completa por fila y hacer el resto en JMP usando utilidades de recodificación y columna. Con suerte, estos también se pueden usar con un archivo similar.
- Para escribir estas cosas, debe probar cada paso y, si el paso parece estar bien, guarde/copie el script en una ventana de script y realice el siguiente paso.
- Así es como se creó el siguiente script.
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.
Fue divertido pasar por esto, pero tomó algo de tiempo superar los extraños desafíos de datos descritos anteriormente. Sin embargo, debido a los scripts y fórmulas incorporados, no demasiado 
Un consejo más: para obtener las fórmulas de recodificación, use recodificar y guárdelo como columna de fórmula, busque en el editor de fórmulas y listo.
Mejor,
Martín
Cree una tabla de datos con las columnas de datos necesarias (p. ej., "nombre", "cname", etc.). Hay límites extraños "({[" al principio y "]})" al final de estos datos. Sustituya "{" y "}" para que tenga una lista simple de sublistas. Luego itere sobre la lista y procese las sublistas una a la vez. Él valor variable los pares están en un orden simple para que pueda agregar una fila a la tabla de datos a la vez.
No tengo tiempo ahora para escribir un script simple para demostrar este enfoque.