JSL はテーブル内のデータを指定されたバイナリ ファイルに直接変更するにはどうすればよいでしょうか?「Text.blk」は C:\ に保存されたバイナリ ファイルで、JSL がデータ テーブル内のデータを書き込み、書き換え、置換する方法を示します。
以下のコードは Excel の A 列のデータを C 列に書き込むことができる Excel の VBA コードです。テキスト.ブロック。

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 バイトのチャンクとして扱います。 また、BLOB 内の配列要素 (常に倍精度 8 バイト数値) を符号付きまたは符号なしの整数または浮動小数点数にすることもできます。 また、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 つのデータに対応していませんでした。
私の要件は、テーブルの 4 つのデータ ポイントを *.blk ファイルとして新しいファイルとして出力することです。元の BLK ファイルは出力前に削除されました。
特定の VBA Excel ファイルを再アップロードして開き、「BLK」ボタンをクリックすると、「1t. 「C:\」のパスにある「BLK」ファイル。

JSL コードの記述方法を要求することで、VBA のこの機能を実現できます。テーブル内の 4 つのデータは直接生成され、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 はテーブル内のデータを指定されたバイナリ ファイルに直接変更するにはどうすればよいですか?blob オプションを指定して、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 はテーブル内のデータを指定されたバイナリ ファイルに直接変更するにはどうすればよいですか?テキスト.BLK
コード
123029
128108
113555
113038