二进制文件具有表格数据。
每行 144 个字节,
第一列是8字节的毫秒时间戳,
每个后续列按 4 个字节分隔。
关键是下面只是提取部分列的数据。

我编写了一个可以读取数据的 JSL,但是速度较慢。
请专家帮忙修复。
co = 144;
bb = Load Text File( file, blob() );
gs = 9;
m = 0;
g = 1;
k = 1;
ar = [];
ar = J( z, g + gs, . );//20230815
For( k = 1, k <= z, k++,
ff = Blob Peek( bb, (k - 1) * co + 0, 8 );
a = "";
Try( a = Blob To Matrix( ff, "uint", 8, "little", 8 )[1] );
no = Length( Char( a ) );
If( no > 0,
Try(
nn = Format( a / 1000 + Informat( "01/01/1970", "mm/dd/yyyy" ) + In Hours( 8 ), "yyyy-mm-ddThh:mm:ss" );
b = Num( Munger( nn, 12, 2 ) || Munger( nn, 15, 2 ) || Munger( nn, 18, 2 ) );
);
If( 91500 <= b < 92600,
m = m + 1;
ar[m, 1] = Num( Munger( nn, 1, 4 ) || Munger( nn, 6, 2 ) || Munger( nn, 9, 2 ) );
ar[m, 2] = b;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 64, 4 );
ar[m, g + 2] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*BM1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 68, 4 );
ar[m, g + 3] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*BM2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 84, 4 );
ar[m, g + 4] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*BL1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 88, 4 );
ar[m, g + 5] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*BL2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 104, 4 );
ar[m, g + 6] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*MM1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 108, 4 );
ar[m, g + 7] = Blob To Matrix( ff, "int", 4, "little", 1 )[1] / 1000/*MM2*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 124, 4 );
ar[m, g + 8] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*ML1*/;
i = 1;
ff = Blob Peek( bb, (k - 1) * co + 128, 4 );
ar[m, g + 9] = Blob To Matrix( ff, "int", 4, "little", 1 )[1]/*ML2*/;
);
,
Break()
);
);
谢谢专家!
使用 JSL 分析器查找热点。
分析器可能会将 blobpeek 和 blobtomatrix 函数显示为鲜红色。看起来它们被 4 字节 blob 调用了数百万次。
尝试一下:进行一次巨大的 blobtomatrix 调用,将整个文件转换为四字节整数。这应该只需要几秒钟。使用 JMP 的矩阵操作从中获取所需的数据。您可能无需任何 for 循环即可完成整个转换。
如果需要,您可以创建另一个由 4 字节或 8 字节整数、uint、浮点组成的巨型矩阵。仅使用具有正确二进制数据的列。我可能只会将两个 4 字节整数组合起来以生成 8 字节值,类似于 x[row,1] + ( x[row,2]*(2^32) )。我没有研究你用它们做什么,所以这可能不是你需要的。
另外:当您使用 blobtomatrix 处理 8 字节整数时,JMP 只能保留 64 位中的 52 位。由于第 6 列和第 7 列为零,并且是 8 字节小端数的高位,因此它可能会正常工作。(双精度浮点数只有 52 位小数。)
谢谢克雷格!
因为文件开头的数据不完整,所以我取了最后一行的内容
此代码用于两个拆分和两个 Blob 到矩阵
大概吧。


太棒了!我敢打赌它的速度也快了很多!JSL 中没有一个循环,所有循环都是在 C++ 内部进行的,因此速度很快。
对于那些正在观看并想知道的人来说:
2:将整个文件读入一个blob。
3:将整个 blob 转换为矩阵。具体来说,矩阵由原始二进制数据(每行 144 个字节)组成,共有 36 列;值均为 4 字节整数。144/4=36。
4:z 似乎未被使用;我“认为”它可能约为 2000 万。
5-16:制作数据表列。
18-19:这些看似无害的语句正在从矩阵中抓取高列数据。
20:尝试从两个 32 位整数生成一个 64 位整数,请参阅之前关于 52 位的注释。同样,这是一步完成的整个列。
21-30:将矩阵中的整列复制并转换到表中。
这非常酷,因为数据中没有浮点或文本值。浮点数可以用第二个 4 或 8 浮点数矩阵处理。文本更难,但仍然可行;根据 7 位、8 位、Unicode 字符集和固定长度或可变长度字符串的变化,有不同的选择。