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スクリプティングRe:JSLは、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?text.BLK
Re:JSLは、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?loadTextFileをblobオプションとともに使用します(ファイルタイプは無視されます)。 次に、やりたいことに応じて、次のいずれかを実行します。
- ブロブを16進数に変換し、16進数を操作し(バイナリバイトの2倍の文字数)、16進数をblobに変換し直します
- blobPeek()を使用してblobをセグメント化し、データを挿入してblobを再構築します
- blobToMatrixを使用してデータを抽出し、matrixToBlobを使用してblobを再アセンブルします。 これはおそらく、ファイルに応じて、最も強力で、最速で、最も使いやすいか、最も使いにくいものです。 blobToMatrix関数は、blob全体(上記の2からの場合があります)をマトリックス内の1、2、4、または8バイトのチャンクに分解します。チャンクは、ビッグエンディアンまたはリトルエンディアンの整数または浮動小数点数にすることができます。 (データがステレオwavファイルの場合、たとえば、16ビット整数サンプルの2列のマトリックスを作成できます。)
最後に、saveTextFileを使用してblobを保存します。 保存するblobまたはテキスト文字列を指定するため、blobオプションは必要ありません。
Re:JSLは、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?クレイジありがとう!
これらの操作は、JSLを使用して直接実行できますか?
最初のメソッドをJSLとして記述できるかどうか疑問に思いました。
専門家に感謝します!
Re:JSLは、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?書いてみましたが、要点が不明でした。
ありがとう!

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は、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?クレイジありがとう!
私はあなたのJSLコードを学びました、私は胸の谷間がありません。
不注意で「text.blk」ファイルを誤ってアップロードしてしまいました。ごめんなさい。
元のアップロードは、テーブルの4つのデータに対応していませんでした。
私の要件は、テーブルの4つのデータポイントを新しいファイルとして* .blkファイルとして出力することです。元のBLKファイルは出力前に削除されました。
特定のVBAExcelファイルを再アップロードして開き、[BLK]ボタンをクリックすると、「1t」が生成されます。 「C:\」のパスにある「BLK」ファイル。

JSLコードの記述方法の要求により、VBAのこの機能を実現できます。テーブル内の4つのデータが直接生成され、VBAで生成されたBLKファイルはまったく同じです。
ありがとう!
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は、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?クレイジありがとう!
そうですか。 それは間違った方向です。
「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は、テーブル内のデータを指定されたバイナリファイルに直接変更するにはどうすればよいですか?「1T.blk」ファイルをもう一度ダウンロードしてください。
その構造と、テーブルの4行を「1T.blk」の形式で保存する方法を参照してください。
クレイジありがとう!

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バイト順マークを追加し、ASCIINUL文字を処理できない可能性があります。 ただし、JMPのBLOBタイプで使用すると、ファイルはバイナリデータのみで読み取り/書き込みされます。
- BlobToMatrixとMatrixToBlobは逆関数です。 これらは、すべての配列要素またはすべてのblob要素を1、2、4、または8バイトのチャンクとして扱います。 また、配列要素(常に倍精度の8バイト数)を符号付きまたは符号なしの整数、またはblob内の浮動小数点数にすることもできます。 また、ブロブ内のビッグエンディアンとリトルエンディアンの表現を処理できます。 また、BlobToMatrixには、マトリックスに複数の列を作成するための追加の引数があります。
- BlobPeekを使用して、均一なチャンクサイズではないバイナリデータのセクションを処理することをお勧めします。||演算子を連結して、blobを結合します。