JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択する入力リストを使用してディレクトリからファイルをプルするスクリプトがあります。ファイル形式が特殊であるため、多少の操作が必要であり、各ファイルは 60MB 程度であるため、インポートには予想以上に時間がかかる可能性があります。私の問題は、ほとんどのファイルには行15に目的のヘッダー行がありますが、約10%のファイルには行10〜14のどこかにヘッダーがある可能性があり、ファイルを開くまで知る方法がないことです。
私の現在の解決策は、スクリプトで最初の20行を開き、ヘッダーを含む行を検索してその行番号を変数に割り当て、そのdtを閉じてから再度開きますが、変数をヘッダーとして使用し、変数+ 1を変数として使用します。最初の行。それは機能しますが、これらのファイルを2回開いていることになります(1回は限定的なプレビューのみです)。
1) これを行うより良い方法はありますか?
2)そして、私が尋ねている間、テーブルをインポートし、名前に基づいて必要な列のみをインポートする方法はありますか?私のファイルには約 1000 列ありますが、そのうち必要なのは約 15 列だけです。
Re: JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択するあなたは正しいと思います。 parse() を使用して文字列を式に変換する必要がある場合があります。
文字列を回避し、式を直接操作する別のアプローチを次に示します。
// testing data (I modified your end of field with a tab, below)
filelist = {"$sample_data\..\Import Data\bigclass.txt"};
x = 1;
// build an expression with a placeholder COLUMNSEXPR
openstmt = Expr(
Open(
FileList[x],
COLUMNSEXPR, // << placeholder for columns(...)
Import Settings( End Of Line( CRLF, CR, LF ), End Of Field( tab, CSV( 0 ) ),
Strip Quotes( 1 ), Column Names Start( 1 ), Data Starts( 1 ) )
)
);
// if you run the openstmt function now, it will import all the columns
//
// eval(openstmt);
// build a list using {} to make it easy to manipulate
COLUMNSLIST = {};
// insert the column you want to keep
Insert Into( COLUMNSLIST, Expr( New Column( "Col1", Character, "Nominal" ) ) );
// insert 5 omit columns...
For( i = 1, i < 5, i += 1,
Insert Into( COLUMNSLIST, Expr( Omitted Column( . ) ) )
);
// COLUMNSLIST looks like this:
//{New Column( "Col1", Character, "Nominal" ), Omitted Column( . ),
//Omitted Column( . ), Omitted Column( . ), Omitted Column( . )}
// convert the {...} to columns(...)
Substitute Into( COLUMNSLIST, Expr( {} ), Expr( columns ) );
//show(nameexpr(COLUMNSLIST)); shows this:
//columns(New Column("Col1", Character, "Nominal"),
//Omitted Column(.), Omitted Column(.),
//Omitted Column(.), Omitted Column(.))
//
// if you leave out the nameexpr() it will (try to) evaluate rather than
// retrieving the expression for display. columns() is not a function in
// JSL, so evaluating makes an error message.
// nameexpr(openstmt) still show COLUMNSEXPR. replace it:
Substitute Into( openstmt, Expr( COLUMNSEXPR ), Name Expr( COLUMNSLIST ) );
// nameexpr(openstmt) is now
//Open(
// FileList[x],
// columns(
// New Column( "Col1", Character, "Nominal" ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . ),
// Omitted Column( . )
// ),
// Import Settings(
// End Of Line( CRLF, CR, LF ),
// End Of Field( tab, CSV( 0 ) ),
// Strip Quotes( 1 ),
// Column Names Start( 1 ),
// Data Starts( 1 )
// )
//)
Eval( openstmt ); // reads just the first column of the table式ではなくテキストを操作して同様のことを行うこともできます。
eval(parse( " the text you built ") )
最も使いやすいテクニックを使用してください。式を操作する速度はわずかに向上しますが、ディスクからファイルを読み取る場合に比べればそれほど重要ではありません。
上記の最後のステートメントは、開くファイルを選択するために X の値に依存しているため、式を再構築する必要がないことに注意してください。
Re: JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択する@Craige_Hales
これらの .csv のようなファイルのインポートのコードを短縮する方法を探しています。1 つのインポートには約 1000 列があり、もう 1 つは約 360 列あります。これは、「FileList」と呼ばれるリスト内の数百のファイルをループします。上記の理由により、列 1 のみをインポートしたいと考えています。私の現在のコードは次のようになります。
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
eval(columns(
New Column( "Col1", Character, "Nominal" ),
Omitted Column( . ),
Omitted Column( . ),
Omitted Column( . ), <FONT color="#FF0000">(repeated 400 times!)</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
//invisible
);しかし、私は eval() 型式の使用方法を理解しようとしていましたが、正しく行っていません。さまざまな場所で eval() 式を試しましたが、理解できないようです。eval() は初めてです。おそらく私の問題は、変数「Omit」が文字列になるが引用符で囲まれてしまうことだと考えています。
<FONT color="#339966"> Omit</FONT> = repeat("Omitted Column( . ),",400)||"Omitted Column( . )";
For( x = 1, x <= N Items( FileList ), x++,
dt = Open(
FileList[x],
<FONT color="#FF0000">eval(</FONT>columns(
New Column( "Col1", Character, "Nominal" ),
<FONT color="#339966">Omit</FONT><FONT color="#FF0000">);</FONT>
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Spaces, Space, CSV( 0 ) ),
Strip Quotes( 1 ),
Column Names Start( 1 ),
Data Starts( 1 ),
),
);
Re: JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択するお役に立ててうれしいです。欲しいものリストに加える価値のある項目のように思えます。
Re: JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択するありがとうクレイジ。 列ヘッダーを持つ行を取得するための最初のインポートでは、あなたのアドバイスを参考にして、列2から1000に省略列を使用したため、20行の列1のみをインポートし、必要なものを取得して閉じます。 次にファイルを再度開きますが、ループの最初の部分の情報を使用して列ヘッダー行を適切に選択します。
ループの 2 番目の部分に特定の列をインポートするためのより良い方法があればいいのにと思います。 私の状況では、生の入力ファイルの列は、時間の経過とともに知らないうちに順序と数量が変更される可能性があります。 JMP にインポートしたい列のみを名前で指定できる機能があれば素晴らしいでしょう。Re: JSL テーブルのインポート - 必要な行番号が可変の場合にヘッダーとして正しい行を選択する1) 2 つのインポートがおそらく最も簡単な方法であり、より速く作成できると思います...
2) インポートする列以外にも指定する必要がありますが、高速化にはそれだけの価値があります...
use the text import wizard to mark the unwanted columnsuse the text import wizard to mark the unwanted columnsテキストインポートウィザードを使用して不要な列をマークします
Grab the source script, it has the JSL to omit columnsGrab the source script, it has the JSL to omit columnsソース スクリプトを取得します。列を省略するための JSL が含まれています。
(省略された列が 1000 個ある場合は、GUI で除外するよりも JSL を編集する方が簡単な場合があります。)
これで、ソース スクリプトを微調整できるようになりました。 その下に最初の 100 行が表示されます。 (1) 列に関するすべてが指定されており、(2) 100 行後に停止するため、高速です。 このデータには、Labels(0) と DataStarts(1) を指定する必要がありました。
Open(
"f:\logOriginalAntenna.txt",// 100MB file takes about 2 seconds to load 100 lines
columns(
Omitted Column( . ),// use the import wizard to
Omitted Column( . ),// get a source script with
Omitted Column( . ),// omitted columns
New Column( "c000004",
Numeric,
"Continuous",
Format( "yyyy-mm-ddThh:mm:ss", 23, 3 ),
Input Format( "yyyy-mm-ddThh:mm:ss", 3 )
),
New Column( "c000005", Character, "Nominal" )
),
Import Settings(
End Of Line( CRLF, CR, LF ),
End Of Field( Tab, Comma, CSV( 1 ) ),
Strip Quotes( 1 ),
Use Apostrophe as Quotation Mark( 0 ),
Use Regional Settings( 0 ),
Scan Whole File( 1 ),
Treat empty columns as numeric( 0 ),
CompressNumericColumns( 0 ),
CompressCharacterColumns( 0 ),
CompressAllowListCheck( 0 ),
Labels( 1 ),
Column Names Start( 1 ),
Data Starts( 2 ),
Lines To Read( 100 ),// specify the number of rows
Year Rule( "20xx" )
)
)
ファイルの列順序が常に同じである場合、形式を明示的に指定すると (上記)、インポートする前に JMP がファイルを調査する必要がなくなります。 JMPはまだ研究していると思います全体たとえ 100 行で停止したとしても、ファイルに保存できるため、処理時間が大幅に短縮される可能性があります。
ファイルの列数や列の順序が常に同じであるとは限らない場合、これは機能しません。 単一のインポートを使用して、テーブルをインポートし、列名とデータ型を修正し、不要な行を削除できる場合があります。