JSL如何将表中的数据直接修改为指定的二进制文件?“Text.blk”是保存在C:\下的二进制文件,JSL如何对数据表中的数据进行写入、改写、替换。
下面的代码是Excel的VBA代码,可以将excel A列数据写入C列:\文本.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自动化和脚本Re: JSL如何将表中的数据直接修改为指定的二进制文件?JMP很强大

Re: JSL如何将表中的数据直接修改为指定的二进制文件?谢谢克雷奇!
这样就可以了。以后可以直接用JSL来做。
我试过了:具体数据还需要+1000000。

Re: 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 中的有符号或无符号整数或浮点数。 他们可以处理 blob 中的大端与小端表示。 BlobToMatrix 有一个额外的参数来在矩阵中创建多个列。
- 您可能希望使用 BlobPeek 来处理二进制数据中块大小不一致的部分,而 ||连接运算符将 blob 重新连接在一起。
Re: JSL如何将表中的数据直接修改为指定的二进制文件?请重新下载“1T.blk”文件,
看它的结构,如何把表中的4行以“1T.blk”的形式保存。
谢谢克雷奇!

Re: JSL如何将表中的数据直接修改为指定的二进制文件?谢谢克雷奇!
我懂了。 这是错误的方向。
不要将“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.Re: 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 个整数,那就是它包含的全部内容。 我不知道值的顺序是什么(行专业?列专业?其他?)。
Re: JSL如何将表中的数据直接修改为指定的二进制文件?谢谢克雷格!
我学习了你的JSL代码,我没有乳沟。
我太粗心了,错误地上传了“text.blk”文件。对不起。
原来上传的是表中四个数据不对应的。
我的要求是将表格的4个数据点输出为一个新的文件为*.blk文件。输出前删除了原来的BLK文件。
我重新上传了特定的 VBA Excel 文件,打开它并单击“BLK”按钮,这将生成一个“1t. “C:\”路径下的“BLK”文件。

请求如何写JSL代码可以实现VBA的这个功能:表中的四个数据是直接生成的,和VBA生成的BLK文件完全一样。
谢谢!
Re: 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)));Re: JSL如何将表中的数据直接修改为指定的二进制文件?我试着写了它,但关键点仍然不清楚。
谢谢!

Re: JSL如何将表中的数据直接修改为指定的二进制文件?谢谢克雷格!
这些操作可以直接使用JSL来完成吗?
我想知道您是否可以将第一个方法编写为 JSL。
谢谢专家!
Re: JSL如何将表中的数据直接修改为指定的二进制文件?将 loadTextFile 与 blob 选项一起使用(它会忽略文件类型)。 然后,根据你想做什么,其中之一:
- 将 blob 转换为十六进制,操作十六进制(字符数是二进制字节的两倍),将十六进制转换回 blob
- 使用 blobPeek() 对 blob 进行分段,然后使用注入的数据重新组装 blob
- 使用 blobToMatrix 提取数据,使用 matrixToBlob 重新组装 blob。 这可能是最强大、最快、最容易或最难使用的,具体取决于文件。 blobToMatrix 函数会将整个 blob(可能来自上面的 2)分解为矩阵中的 1、2、4 或 8 字节块;块可以是大端或小端整数或浮点数。 (例如,如果数据是立体声 wav 文件,您可以制作一个 16 位整数样本的 2 列矩阵。)
最后,使用 saveTextFile 保存 blob。 它不需要 blob 选项,因为您可以给它一个 blob 或一个文本字符串来保存。
Re: JSL如何将表中的数据直接修改为指定的二进制文件?文本.BLK
代码
123029
128108
113555
113038