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重新连接在一起。