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:\text.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 SubScriptingRe: Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié?text.BLK
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, en fonction de ce que vous voulez faire, l'un de ceux-ci:
- convertir le blob en hexadécimal, manipuler l'hex (deux fois plus de caractères que les 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 l'objet 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 peut être de 2, ci-dessus) en blocs de 1, 2, 4 ou 8 octets dans une matrice; les blocs peuvent être des nombres entiers gros ou petit boutiens ou des flottants. (Si les données étaient un fichier wav stéréo, vous pouvez créer une matrice à 2 colonnes d'échantillons d'entiers 16 bits, par exemple.)
Enfin, enregistrez l'objet blob avec saveTextFile. Il n'a pas besoin d'une option blob car vous lui donnez un blob ou 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é?Merci Craige!
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 JSL.
Merci les experts!
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é?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é?Merci Craige!
J'ai appris votre code JSL, je n'ai pas de clivage.
J'étais si imprudent 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 forme de nouveau fichier au format * .blk. Le fichier BLK d'origine a été supprimé avant la sortie.
J'ai retéléchargé 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 du 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é?Je ne sais rien des fichiers BLK et très peu de 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?) Les valeurs sont dans.
Re: Comment JSL peut-il modifier les données d'une table directement dans un fichier binaire spécifié?Merci Craige!
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 de fichier dans laquelle les données du tableau seront sauvegardées.
J'ai essayé d'écrire JSL:

Mais je ne sais toujours pas comment enregistrer les données dans le tableau sous la forme du 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é?Veuillez télécharger à nouveau le fichier "1T.blk",
voir sa structure, et comment enregistrer les 4 lignes du tableau sous la forme de "1T.blk".
Merci Craige!

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" )
);
Quiconque suit:
- les fonctions LoadTextFile et SaveTextFile fonctionnent normalement avec des données de texte de chaîne de caractères et modifient éventuellement les fins CRLF, ajoutent UNICODE Byte Order Mark 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 avec uniquement 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 joindre les objets blob.