¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?"Text.blk" es un archivo binario guardado en C:\, cómo JSL puede escribir, reescribir y reemplazar los datos en la tabla de datos.
El siguiente código es el código VBA de Excel, que puede escribir los datos de la columna A a C de Excel:\ texto.negro.

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 SubAutomatización y secuencias de comandosRe: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?JMP es poderoso

Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Gracias Craig!
Que hará. Se puede hacer directamente con JSL en el futuro.
Lo intenté: los datos específicos todavía necesitan +1000000.

Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Aún necesitará agregar 1,000,000 si eso es lo que necesita, pero algo como esto
dt = Open( "$desktop/1T.jmp" );
filename = Save Text File(
"$temp/deleteme.blk",
Matrix To Blob( dt:code << getvalues, "int", 4, "little" )
);
Cualquiera que lo siga:
- las funciones LoadTextFile y SaveTextFile normalmente funcionan con datos de texto de cadenas de caracteres y posiblemente cambien las terminaciones CRLF, agreguen la marca de orden de bytes UNICODE y no puedan manejar el carácter ASCII NUL. Pero, cuando se usa con el tipo BLOB de JMP, el archivo se lee/escribe solo con los datos binarios.
- BlobToMatrix y MatrixToBlob son funciones inversas. Tratan todos los elementos de matriz o todos los elementos de blob como fragmentos de 1, 2, 4 u 8 bytes. También pueden hacer que los elementos de la matriz (que siempre son números de 8 bytes de precisión doble) sean enteros con o sin signo o números de punto flotante en el blob. Y pueden manejar representaciones big-endian vs little-endian en el blob. Y BlobToMatrix tiene un argumento extra para hacer varias columnas en la matriz.
- Es posible que desee utilizar BlobPeek para tratar con secciones de los datos binarios que no tienen tamaños de fragmento uniformes, y el || Operador de concatenación para volver a unir blobs.
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Vuelva a descargar el archivo "1T.blk",
vea su estructura y cómo guardar las 4 filas en la tabla en forma de "1T.blk".
Gracias Craig!

Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Gracias Craig!
Veo. Es la dirección equivocada.
En lugar de escribir datos "1T.blk" en la tabla, guarde los datos en la tabla como "1T.blk".
Doy "1T. BLK”, solo para indicar el formato de archivo en el que se guardarán los datos de la tabla.
Intenté escribir JSL:

Pero todavía no sé cómo guardar los datos en la tabla en forma de gráfico. El nombre del sufijo del archivo guardado no es la clave.
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: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?No sé nada sobre los archivos BLK y muy poco sobre VBA, pero *podría* ser el caso de que un archivo BLK sea realmente 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 esperaba 64 enteros en el archivo anterior, eso es todo lo que contiene. No tengo idea de en qué orden (¿fila principal? ¿columna principal? ¿otro?) están los valores.
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Gracias Craig!
He aprendido tu código JSL, no tengo escote.
Fui tan descuidado que subí el archivo "text.blk" por error. Lo siento.
La carga original no se correspondía con los cuatro datos de la tabla.
Mi requisito es generar los 4 puntos de datos de la tabla como un archivo nuevo como archivo * .blk. El archivo BLK original se eliminó antes de la salida.
Volví a cargar el archivo VBA Excel específico, lo abrí e hice clic en el botón "BLK", que generaría un "1t. BLK" en la ruta de "C:\".

La solicitud de cómo escribir código JSL puede lograr esta función de VBA: los cuatro datos en la tabla se generan directamente y el archivo BLK generado por VBA es exactamente igual.
¡Gracias!
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?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: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Intenté escribirlo, pero los puntos clave seguían sin estar claros.
¡Gracias!

Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Gracias Craig!
¿Se pueden hacer estas operaciones directamente usando JSL?
Me preguntaba si podría escribir el primer método como JSL.
¡Gracias expertos!
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?Use loadTextFile con la opción blob (ignora el tipo de archivo). Luego, dependiendo de lo que quieras hacer, uno de estos:
- convertir el blob en hexadecimal, manipular el hexadecimal (el doble de caracteres que bytes binarios), convertir el hexadecimal de nuevo en blob
- use blobPeek() para segmentar el blob, luego vuelva a ensamblar el blob con sus datos inyectados
- use blobToMatrix para extraer los datos y matrixToBlob para volver a ensamblar el blob. Este es quizás el más potente, el más rápido y el más fácil o el más difícil de usar, según el archivo. La función blobToMatrix descompondrá todo el blob (que podría ser del 2 anterior) en fragmentos de 1, 2, 4 u 8 bytes en una matriz; los fragmentos pueden ser números enteros big-endian o little-endian o flotantes. (Si los datos fueran un archivo wav estéreo, podría crear una matriz de 2 columnas de muestras enteras de 16 bits, por ejemplo).
Finalmente, guarde el blob con saveTextFile. No necesita una opción de blob porque le da un blob o una cadena de texto para guardar.
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario específico?texto.BLK
código
123029
128108
113555
113038