Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?"Text.blk" è un file binario salvato in C: \, come JSL può scrivere, riscrivere e sostituire i dati nella tabella dei dati.
Il codice seguente è il codice VBA di Excel, che può scrivere i dati della colonna Excel da 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 SubScriptingRi: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?text.BLK
Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Usa loadTextFile con l'opzione blob (ignora il tipo di file). Quindi, a seconda di cosa vuoi fare, uno di questi:
- convertire il blob in esadecimale, manipolare l'esadecimale (il doppio dei caratteri rispetto ai byte binari), riconvertire l'esadecimale in blob
- utilizzare blobPeek () per segmentare il blob, quindi riassemblare il blob con i dati iniettati
- utilizzare blobToMatrix per estrarre i dati e matrixToBlob per riassemblare il BLOB. Questo è forse il più potente, veloce e più facile o più difficile da usare, a seconda del file. La funzione blobToMatrix scomporrà l'intero blob (che potrebbe essere da 2, sopra) in blocchi da 1, 2, 4 o 8 byte in una matrice; i blocchi possono essere numeri interi o float big o little endian. (Se i dati fossero un file wav stereo, potresti creare una matrice a 2 colonne di campioni interi a 16 bit, ad esempio.)
Infine, salva il BLOB con saveTextFile. Non necessita di un'opzione BLOB perché gli si fornisce un BLOB o una stringa di testo da salvare.
Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Grazie Craige!
Queste operazioni possono essere eseguite direttamente utilizzando JSL?
Mi chiedevo se potessi scrivere il primo metodo come JSL.
Grazie Esperti!
Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Ho provato a scriverlo, ma i punti chiave sono rimasti poco chiari.
Grazie!

Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?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)));Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Grazie Craige!
Ho imparato il tuo codice JSL, non ho clivaggio.
Sono stato così sbadato che ho caricato per errore il file "text.blk". Mi dispiace.
Il caricamento originale non corrispondeva ai quattro dati nella tabella.
Il mio requisito è di produrre i 4 punti dati della tabella come un nuovo file come file * .blk. Il file BLK originale è stato cancellato prima dell'output.
Ho ricaricato il file Excel VBA specifico, l'ho aperto e ho fatto clic sul pulsante "BLK", che avrebbe generato un "1t. BLK "file nel percorso di" C: \ ".

La richiesta di come scrivere codice JSL può realizzare questa funzione di VBA: i quattro dati nella tabella vengono generati direttamente e VBA generato file BLK esattamente lo stesso.
Grazie!
Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Non so nulla dei file BLK e molto poco di VBA, ma * potrebbe * essere il caso che un file BLK sia davvero semplice:
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]Se ti aspettavi 64 numeri interi nel file precedente, è tutto ciò che contiene. Non ho idea in quale ordine (riga principale? Colonna principale? Altro?) I valori sono in.
Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Grazie Craige!
Vedo. È la direzione sbagliata.
Invece di scrivere i dati "1T.blk" nella tabella, salvare i dati nella tabella come "1T.blk".
Io do "1T. BLK ", solo per indicare la forma del file in cui verranno salvati i dati nella tabella.
Ho provato a scrivere JSL:

Ma ancora non so come salvare i dati nella tabella sotto forma di grafico. Il nome del suffisso del file salvato non è la chiave.
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.Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Scarica di nuovo il file "1T.blk",
vedere la sua struttura, e come salvare le 4 righe della tabella sotto forma di "1T.blk".
Grazie Craige!

Ri: Come può JSL modificare i dati in una tabella direttamente in un file binario specificato?Avrai ancora bisogno di aggiungere 1.000.000 se è quello che ti serve, ma qualcosa del genere
dt = Open( "$desktop/1T.jmp" );
filename = Save Text File(
"$temp/deleteme.blk",
Matrix To Blob( dt:code << getvalues, "int", 4, "little" )
);
Chiunque segua:
- le funzioni LoadTextFile e SaveTextFile normalmente funzionano con dati di testo di stringhe di caratteri e probabilmente cambieranno le terminazioni CRLF, aggiungeranno UNICODE Byte Order Mark e non potranno gestire il carattere ASCII NUL. Tuttavia, se utilizzato con il tipo BLOB di JMP, il file viene letto / scritto solo con i dati binari.
- BlobToMatrix e MatrixToBlob sono funzioni inverse. Trattano tutti gli elementi dell'array o tutti gli elementi blob come blocchi da 1, 2, 4 o 8 byte. Possono anche fare in modo che gli elementi dell'array (che sono sempre numeri a 8 byte di precisione doppia) siano interi con o senza segno o numeri in virgola mobile nel BLOB. E possono gestire rappresentazioni big e little endian nel blob. E BlobToMatrix ha un argomento in più per creare più colonne nella matrice.
- Potresti voler utilizzare BlobPeek per gestire sezioni dei dati binari che non sono di dimensioni di blocco uniformi e || operatore di concatenazione per unire nuovamente i BLOB.