¿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 de Excel A 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: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario especificado?text.BLK
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario especificado?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 reensamblar 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 de 2, arriba) en trozos de 1, 2, 4 u 8 bytes en una matriz; los trozos pueden ser números enteros big o little-endian o flotantes. (Si los datos fueran un archivo wav estéreo, podría hacer 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 especificado?¡Gracias Craige!
¿Se pueden realizar 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 especificado?Traté de 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 especificado?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 especificado?¡Gracias Craige!
He aprendido tu código JSL, no tengo escote.
Fui tan descuidado que cargué el archivo "text.blk" por error. Lo siento.
La carga original no correspondía a 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í y 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 el mismo.
¡Gracias!
Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario especificado?No sé nada sobre los archivos BLK y muy poco sobre VBA, pero * podría * darse 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 especificado?¡Gracias Craige!
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 especificado?Vuelva a descargar el archivo "1T.blk",
vea su estructura y cómo guardar las 4 filas de la tabla en forma de "1T.blk".
¡Gracias Craige!

Re: ¿Cómo puede JSL modificar datos en una tabla directamente a un archivo binario especificado?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 cadena de caracteres y posiblemente cambiarán las terminaciones CRLF, agregarán la marca de orden de bytes UNICODE y no pueden 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 la 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 doble precisión) sean enteros con o sin signo o números de punto flotante en el blob. Y pueden manejar representaciones big-vs little-endian en el blob. Y BlobToMatrix tiene un argumento adicional para hacer múltiples columnas en la matriz.
- Es posible que desee utilizar BlobPeek para tratar las secciones de los datos binarios que no tienen tamaños de fragmentos uniformes y || operador de concatenar para unir blobs de nuevo.