Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?"Text.blk" est un fichier binaire enregistré dans C:\, comment JSL peut écrire, réécrire et remplacer les données dans la table de données.
Le code suivant est le code VBA d'Excel, qui peut écrire les données de la colonne Excel A à C
texte.blk.

Sub text()
Dim arr, I, filename As String, t As Long
filename = "c:\text.BLK"
Open filename For Binary As #1: arr = Range("a2:a" & Cells(Rows.Count, "a").End(3).Row)
For r = 1 To UBound(arr)
If Left(arr(r, 1), 2) = "12" Then arr(r, 1) = 1000000 + arr(r, 1)
Next
For I = 1 To UBound(arr, 1)
If IsNumeric(arr(I, 1)) Then Put #1, , CLng(arr(I, 1))
Next
Close #1
End SubAutomatisation et scriptRe : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?JMP est puissant

Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Merci Craig!
Cela suffira. Cela peut être fait directement avec JSL à l'avenir.
J'ai essayé : les données spécifiques ont toujours besoin de +1000000.

Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Vous devrez toujours ajouter 1 000 000 si c'est ce dont vous avez besoin, mais quelque chose comme ça
dt = Open( "$desktop/1T.jmp" );
filename = Save Text File(
"$temp/deleteme.blk",
Matrix To Blob( dt:code << getvalues, "int", 4, "little" )
);
Toute personne qui suit :
- les fonctions LoadTextFile et SaveTextFile fonctionnent normalement avec des données de texte de chaîne de caractères et modifieront éventuellement les terminaisons CRLF, ajouteront une marque d'ordre d'octet UNICODE et ne peuvent pas traiter le caractère ASCII NUL. Mais, lorsqu'il est utilisé avec le type BLOB de JMP, le fichier est lu/écrit uniquement avec les données binaires.
- BlobToMatrix et MatrixToBlob sont des fonctions inverses. Ils traitent tous les éléments du tableau ou tous les éléments blob comme des blocs de 1, 2, 4 ou 8 octets. Ils peuvent également faire en sorte que les éléments du tableau (qui sont toujours des nombres à double précision de 8 octets) soient des entiers signés ou non signés ou des nombres à virgule flottante dans le blob. Et ils peuvent gérer les représentations big- vs little-endian dans le blob. Et BlobToMatrix a un argument supplémentaire pour créer plusieurs colonnes dans la matrice.
- Vous voudrez peut-être utiliser BlobPeek pour traiter les sections des données binaires qui ne sont pas des tailles de bloc uniformes, et le || opérateur de concaténation pour réunir les blobs ensemble.
Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Veuillez télécharger à nouveau le fichier "1T.blk",
voir sa structure, et comment sauvegarder les 4 lignes du tableau sous la forme "1T.blk".
Merci Craig!

Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Merci Craig!
Je vois. C'est la mauvaise direction.
Au lieu d'écrire les données "1T.blk" dans la table, enregistrez les données dans la table sous "1T.blk".
Je donne "1T. BLK ", juste pour indiquer la forme du fichier dans lequel les données du tableau seront enregistrées.
J'ai essayé d'écrire JSL:

Mais je ne sais toujours pas comment enregistrer les données dans le tableau sous la forme d'un graphique. Le nom du suffixe du fichier enregistré n'est pas la clé.
dt = Current Data Table();
dt << New Column( "new", formula( If( Left( Char( :code ), 2 ) == "12", 1000000 + :code, :code ) ) );
dt << run formulas;
Column( "new" ) << deleteFormula;
Wait( 0 );
mx = dt << GetAsMatrix( {2} );
mx << Save( "C:\1T.BLK" );//The saved file suffix name is not the key.Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Je ne connais rien aux fichiers BLK et très peu à VBA, mais il se peut qu'un fichier BLK soit vraiment simple :
b = loadTextFile("z:/text.blk",blob()); // load your file
mat = blobtomatrix(b,"int",4,"little"); // operate on matrix data
/*:
[1123029, 1113555, 1110044, 1113038, 1113581, 1128108, 1110073, 1113509, 1113521,
1113037, 1113576, 1113586, 1113580, 1113035, 1113027, 1113592, 1113599, 1110059,
1113556, 1113565, 1113595, 1113543, 1113600, 1113520, 1113575, 1110072, 1113571,
1110067, 1113029, 1113582, 1113601, 1113011, 1110058, 1113034, 1113561, 1113593,
1113550, 1113008, 1110066, 1113548, 1113583, 1113039, 1113562, 1113537, 1113577,
1113527, 1113587, 1113541, 1113596, 1110053, 1113578, 1113526, 1113566, 1113591,
1113585, 1113589, 1110074, 1113572, 1110060, 1113590, 1113568, 1113021, 113555,
113038]Si vous attendiez 64 entiers dans le fichier précédent, c'est tout ce qu'il contient. Je n'ai aucune idée de l'ordre (ligne principale ? Colonne principale ? Autre ?) Dans lequel se trouvent les valeurs.
Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Merci Craig!
J'ai appris votre code JSL, je n'ai pas de clivage.
J'étais si négligent que j'ai téléchargé le fichier "text.blk" par erreur. Je suis désolé.
Le téléchargement d'origine ne correspondait pas aux quatre données du tableau.
Mon exigence est de sortir les 4 points de données de la table sous la forme d'un nouveau fichier en tant que fichier *.blk. Le fichier BLK d'origine a été supprimé avant la sortie.
J'ai rechargé le fichier Excel VBA spécifique, je l'ai ouvert et j'ai cliqué sur le bouton "BLK", ce qui générerait un "1t. BLK" dans le chemin de "C:\".

La demande d'écriture de code JSL peut réaliser cette fonction de VBA : les quatre données de la table sont directement générées et le fichier BLK généré par VBA est exactement le même.
Merci!
Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?b = loadTextFile("z:/text.blk",blob()); // load your file
hex = hex(b); // operate on hex data
show(hex); // the binary data is now character data
last4hex = right(hex,8); // two hex characters per byte
last4blob = blobpeek(b,length(b)-4,4); // operate on blob data
show(hex(last4blob)); // same data as above
mat = blobtomatrix(b,"int",4,"big"); // operate on matrix data
show(mat[nrows(mat)],hextonumber(last4hex),blobtomatrix(last4blob,"int",4,"big")); // all the same
// change the hex data (1-based offset to substr function, doubled. this is why programmers count from 0.)
show(substr(hex,5,4)); // the 3rd and 4th bytes, "1100". lets change them to "FE23"
hex = substr(hex,1,4) || "FE23" || substr(hex,9);
show(hex);
f1=savetextfile("$temp/text1.blk", hextoblob(hex)); // convert hex to blob before saving
// do the same with a blob (0-based offset to blobpeek function)
f2=savetextfile("$temp/text2.blk",blobpeek(b,0,2)||hextoblob("FE23")||blobpeek(b,4));
// do the same with a matrix. the matrix above is 4-bytes/element, lets use 1 instead
mat = blobtomatrix(b,"int",1,"big");
mat[3]=hextonumber("FE"); // 1-based matrix index
mat[4]=hextonumber("23");
f3=savetextfile("$temp/text3.blk",matrixtoblob(mat,"int",1,"big"));
// check our work:
b1=loadtextfile(f1,blob());
b2=loadtextfile(f2,blob());
b3=loadtextfile(f3,blob());
if(b1==b2==b3, write("\!nmatch, as expected"), write("\!nERROR"));
// this shows the changed data
show(shortesteditscript(hex(b),hex(b1)));Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?J'ai essayé de l'écrire, mais les points clés sont restés flous.
Merci!

Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Merci Craig!
Ces opérations peuvent-elles être effectuées directement à l'aide de JSL ?
Je me demandais si vous pouviez écrire la première méthode en tant que JSL.
Merci Experts !
Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?Utilisez loadTextFile avec l'option blob (elle ignore le type de fichier). Ensuite, selon ce que vous voulez faire, l'un de ceux-ci :
- convertir le blob en hex, manipuler l'hex (deux fois plus de caractères que d'octets binaires), reconvertir l'hex en blob
- utilisez blobPeek() pour segmenter le blob, puis réassemblez le blob avec vos données injectées
- utilisez blobToMatrix pour extraire les données et matrixToBlob pour réassembler le blob. C'est peut-être le plus puissant, le plus rapide et le plus simple ou le plus difficile à utiliser, selon le fichier. La fonction blobToMatrix décomposera le blob entier (qui pourrait provenir de 2, ci-dessus) en morceaux de 1, 2, 4 ou 8 octets dans une matrice ; les morceaux peuvent être des entiers ou des flottants gros ou petit boutiens. (Si les données étaient un fichier wav stéréo, vous pourriez créer une matrice à 2 colonnes d'échantillons entiers de 16 bits, par exemple.)
Enfin, enregistrez le blob avec saveTextFile. Il n'a pas besoin d'une option blob car vous lui donnez soit un blob, soit une chaîne de texte à enregistrer.
Re : Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié ?texte.BLK
code
123029
128108
113555
113038