JSL如何直接將表中的數據修改為指定的二進製文件?“ Text.blk”是保存在C:\中的二進製文件,JSL如何寫入,重寫和替換數據表中的數據。
以下代碼是Excel的VBA代碼,可以將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 Sub腳本編寫回复:JSL如何直接將表中的數據修改為指定的二進製文件?文本.BLK
回复:JSL如何直接將表中的數據修改為指定的二進製文件?將loadTextFile與blob選項一起使用(它將忽略文件類型)。 然後,根據您要執行的操作,執行以下操作之一:
- 將blob轉換為十六進制,操作十六進制(兩倍於二進製字節的字符),將十六進制轉換回blob
- 使用blobPeek()分割blob,然後使用注入的數據重新組裝blob
- 使用blobToMatrix提取數據,並使用matrixToBlob重組blob。 根據文件的不同,這也許是功能最強大,最快,最簡單或最難使用的。 blobToMatrix函數將整個blob(可能是上面的2)分解為矩陣中的1、2、4或8字節塊;塊可以是大端或小端整數或浮點數。 (例如,如果數據是立體聲wav文件,則可以製作一個2列的16位整數樣本的矩陣。)
最後,使用saveTextFile保存Blob。 它不需要blob選項,因為您可以給它一個blob或一個文本字符串來保存。
回复:JSL如何直接將表中的數據修改為指定的二進製文件?感謝Craige!
可以直接使用JSL完成這些操作嗎?
我想知道您是否可以將第一種方法編寫為JSL。
謝謝專家!
回复:JSL如何直接將表中的數據修改為指定的二進製文件?我嘗試編寫它,但是要點仍然不清楚。
謝謝!

回复:JSL如何直接將表中的數據修改為指定的二進製文件?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)));回复:JSL如何直接將表中的數據修改為指定的二進製文件?感謝Craige!
我已經了解了您的JSL代碼,但沒有任何分歧。
我很粗心,所以我錯誤地上傳了“ text.blk”文件。很抱歉。
原始上載與表中的四個數據不對應。
我的要求是將表的4個數據點作為新文件輸出為* .blk文件。原始BLK文件在輸出之前已被刪除。
我重新上傳了特定的VBA Excel文件,將其打開並單擊“ BLK”按鈕,這將生成一個“ 1t”。 “ C:\”路徑中的“ BLK”文件。

請求如何編寫JSL代碼可以實現VBA的此功能:直接生成表中的四個數據與VBA生成的BLK文件完全相同。
謝謝!
回复:JSL如何直接將表中的數據修改為指定的二進製文件?我對BLK文件一無所知,而對VBA卻一無所知,但是*可能* BLK文件非常簡單:
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]如果您希望早期版本的文件中有64個整數,那就足夠了。 我不知道值的順序(行專業?列專業?其他?)。
回复:JSL如何直接將表中的數據修改為指定的二進製文件?感謝Craige!
我懂了。 這是錯誤的方向。
不要將“ 1T.blk”數據寫入表中,而是將表中的數據另存為“ 1T.blk”。
我給“ 1T。 BLK“,僅表示表中數據的保存文件格式。
我嘗試編寫JSL:

但是我仍然不知道如何以圖形形式將數據保存在表中。保存的文件後綴名稱不是關鍵。
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.回复:JSL如何直接將表中的數據修改為指定的二進製文件?請再次下載“ 1T.blk”文件,
了解其結構,以及如何以“ 1T.blk”的形式保存表中的4行。
感謝Craige!

回复:JSL如何直接將表中的數據修改為指定的二進製文件?如果您需要的話,您仍然需要添加1,000,000,但是類似這樣
dt = Open( "$desktop/1T.jmp" );
filename = Save Text File(
"$temp/deleteme.blk",
Matrix To Blob( dt:code << getvalues, "int", 4, "little" )
);
後續的任何人:
- 通常,LoadTextFile和SaveTextFile函數適用於字符串文本數據,並且可能會更改CRLF結尾,添加UNICODE字節順序標記,並且不能處理ASCII NUL字符。 但是,當與JMP的BLOB類型一起使用時,僅使用二進制數據讀取/寫入文件。
- BlobToMatrix和MatrixToBlob是反函數。 他們將所有數組元素或所有blob元素視為1、2、4或8字節塊。 它們還可以使數組元素(始終為雙精度8字節數字)成為帶斑點的有符號或無符號整數或浮點數。 他們可以處理blob中的大端與小端的表示形式。 BlobToMatrix還有一個額外的參數可以在矩陣中創建多個列。
- 您可能想使用BlobPeek處理二進制數據的部分,這些部分不是統一的塊大小,而||連接運算符以將Blob重新連接在一起。