Le fichier txt téléchargé à partir de la page Web, ce fichier contient des données, comment utiliser JSL pour traiter ce fichier txt sous forme de données tabulaires ?
Je ne peux pas le gérer avec JSON. Merci aux experts !

// 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 vous avez JMP 15, vous pouvez également utiliser l'assistant de manière interactive (utilisez JsonWizard(1) pour voir l'interface graphique.)Il a encore besoin d'aide pour supprimer les caractères supplémentaires.Le JSL ci-dessus charge le txt dans x, supprime les caractères 2 et 3 avec substr(), puis passe les données à open(), via un blob, sans réécriture sur le disque. Si vous réécrivez sur le disque, vous pouvez également modifier l'extension en .json.
JMP 15's wizard also guesses the datatypes better in this exampleJMP 15's wizard also guesses the datatypes better in this exampleL'assistant de JMP 15 devine également mieux les types de données dans cet exemple
@davidbarbour
Non, vous avez raison. J'ai passé deux heures à écrire un script basé sur mon approche et j'ai rencontré de nombreux problèmes fastidieux. Je n'ai plus le temps maintenant.
Salut lwx228,
Ci-dessous, vous trouverez un script qui importera les données, recodera de manière appropriée, placera le texte dans les colonnes, empilera, divisera pour obtenir le tableau final.
Quelques remarques car il s'agit d'un format de données assez étrange :
- il y a incohérence avec les délimiteurs et par rapport aux fichiers txt habituels :
- la virgule est utilisée dans les champs et comme séparateur,
- les guillemets sont également utilisés, mais pas pour chaque élément,
- les crochets sont utilisés de plusieurs façons
- Parfois, il y a une déclaration 'nulle' pour une valeur manquante, mais parfois non !
- Il n'y a pas de première ligne avec des noms de colonnes, ils se trouvent dans les champs de données. Cela rend nécessaire de les extraire et d'effectuer l'opération de pile/division pour obtenir les colonnes dont vous avez besoin pour l'analyse (peut-être que quelqu'un a une approche plus simple - serait le bienvenu pour en entendre parler
)
- les paramètres par défaut ne fonctionneront donc pas car vous obtiendrez un mauvais nombre de champs par ligne !
- Le mieux est de lire la chaîne entière par ligne et de faire le reste dans JMP à l'aide des utilitaires de recodage et de colonne. Espérons que ceux-ci puissent également être utilisés avec un fichier similaire.
- Pour écrire ces choses, vous devez tester chaque étape et si l'étape semble correcte, enregistrez/copiez le script dans une fenêtre de script et passez à l'étape suivante.
- C'est ainsi que le script ci-dessous a été créé.
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.
C'était amusant de passer par là, mais il a fallu du temps pour surmonter les défis de données étranges décrits ci-dessus. Cependant, en raison des scripts et des formules intégrés, pas trop 
Un autre conseil : pour obtenir les formules de recodage, utilisez recode et enregistrez-le en tant que colonne de formule, regardez dans l'éditeur de formule et voilà.
Meilleur,
Martin
Créez une table de données avec les colonnes de données nécessaires (par exemple, "name", "cname", etc.). Il y a des clôtures superflues "({[" au début et "]})" à la fin de ces données. Remplacez "{" et "}" pour avoir une simple liste de sous-listes. Parcourez ensuite la liste et traitez les sous-listes une par une. Le variable, valeur les paires sont dans un ordre simple afin que vous puissiez ajouter une ligne à la table de données à la fois.
Je n'ai pas le temps maintenant d'écrire un script simple pour démontrer cette approche.