複数ファイルのインポート、ファイルのフィルタリングこんにちは、みんな、
JSL初心者はこちら! 複数のファイルをインポートする必要があります。インポートされるファイル名には、満たす必要のあるいくつかのパラメータがあります。
- 特定の文字を含めることはできません。これらの文字は常にファイル名の末尾にあります。
- 特定の文字列を含める必要があります
- ファイル名内に同一の文字列セグメントが見つかった場合は、最新のシステム日付とタイムスタンプを持つもののみがインポートされます。 ファイル名の一部を分割して比較する方法が必要です。
例: 「リンゴ」を含むすべてのフルーツ スムージー ドリンクが必要ですが、「トマト」は必要ありません。 (ファイル名、日時 YYYYMMDD HHMM)
Kiwi_Apple_Mango.csv 20220125 1421
Apple_Grape_Kiwi.csv 20220125 1243
ドリアン_トマト.csv 20220126 1607
アップル_グレープ_キウイ_トマト.csv 20220126 1537
マンゴー_バナナ_ドリアン.csv 20220126 0915
グレープ_パイナップル_アップル_アボカド.csv 20220126 0711
Apple_Grape_Kiwi.csv 20220127 1111
ファイルの名前には構造があります。探している文字列は複数の区切り文字の後にあります。
追加の質問
- 何千ものファイルが保存されているフォルダー内でこれらのファイルの検索を高速化するためのヒントはありますか?最初の検索後は拡張子でのみフィルタリングできます。 現在、このフォルダー内のすべてのファイルを検索して見つけるだけでも、何分もかかります。
- 増え続けるファイルをインポートするためのヒントはありますか? インポートされるファイルの数は、数か月以内に 1000 を超える可能性があります。それらはすべて同じデータ構造を持っています。「類似ファイルをスタック」する必要があることはわかっています。これらはすべてデータ テーブルです。
Words 関数と Munger 関数を調べましたが、ファイル インポート スクリプトを完了するために必要なものかどうかわかりません。
データアクセスウィンドウズRe: 複数ファイルのインポート、ファイルのフィルタリングありがとう!Pat Regex を使用した Contains item が効果があるようです。
Re: 複数ファイルのインポート、ファイルのフィルタリングはい、しかし、どれがあなたにとって最適であるかを言うのは難しいです。
contains() を使用して、_ 区切り文字を完全に無視できる場合があります。 トークンかどうかはわかりませんが、パイナップルとりんご問題があるかどうかはわかりませんが、一方にもう一方が含まれているため、問題が発生する可能性があります。 葡萄とグレープフルーツそれも。 おそらく大文字/小文字で解決しますか?
正規表現について学習するとよいでしょう。 (私が使用した正規表現.info .) この関数は、文字の一致、または数値の欠落値を返します。
regex("applepearorange","carrot|pear")
isstring(...) または ismissing(...) と一緒に使用すると、真/偽の答えを取得できます。 |正規表現内の は代替手段です。
contains_item() で正規表現を使用することもできます。 私はこの簡単なテストを除いてこれを使用したことがありません。これがパターンを渡す唯一の方法です。
Contains Item( "apple_grapefruit_lime", Pat Regex( "carrot|grape" ), "_" )
つまり、入力を _ で分割し、各セグメントを正規表現でテストします。
Re: 複数ファイルのインポート、ファイルのフィルタリングコードを以下のように変更しました。機能していますが、最適ではありません。 「abc」は常に単独ではなく、区切り文字「_」で区切られています。たとえば、「_xyzabc_」や「_abcxyz_」が使用されることがあります。 この文字セットを見つけるために文字列全体を反復処理する関数はありますか?文字列は常に文字列内の特定の位置にあります。
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( Contains Item(:Column 1[i], "abc", "_") == 1,
dt <<DELETE row=""></DELETE>
Re: 複数ファイルのインポート、ファイルのフィルタリング問題の一部は if ステートメントの条件にあることに気づいたので、以下のコードに修正しました。コードを編集して全体の先頭の部分文字列を検索しない限り、常に続行されます。 検索しているのは文字列内であり、後方または前方に検索する場合、文字列の先頭または末尾をテストするだけでは探しているものではありません。
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( contains(:Column 1[i], "abc") == 1,
dt <<DELETE row=""></DELETE>
Re: 複数ファイルのインポート、ファイルのフィルタリングこんにちは、Files In Directory() を使用してファイル名のリストを正常に入力しました。Filter Each() を調べましたが、必要な数の条件を追加できないため、For ループ内にネストされたいくつかの条件付き If ステートメントを連鎖させようとしています。 バックグラウンドでは、各ファイル名の dt が各行に 1 つずつ、すべて 1 列に表示されています。
基本的に、!contains() または contains() を使用して各要素を検査し、必要に応じて行を削除するか保持したいと考えています。はい、これにより「 i 」カウンターに問題が発生することは承知しています。カウンターの調整も簡単です。 でも一歩ずつ。 このスクリプトを実行しても、エラーは表示されず、何も起こりません。デバッガーをチェックしたところ、contains() のカウンターのタイプが見つからなかったので、なぜこれが機能しないのか少し混乱しています。何か洞察はありますか?
files_list = Files In Directory( "C:\Data\" );
dt = Current Data Table();
For( i = 1, i <= N Rows( dt ), i++,
if( :Column 1[i] == contains(:Column 1[i], "abc"),
dt <<DELETE row=""></DELETE>
Re: 複数ファイルのインポート、ファイルのフィルタリングこのスレッドに戻ってくると言いたかっただけです。 現時点では、仕事の他のことに集中する必要があります。 忘れていません。
Re: 複数ファイルのインポート、ファイルのフィルタリング(隔離解除されました。申し訳ありませんが、正しいものを選択したことを祈りますが、フラグが立てられた理由は明らかではありません。)
contains() は、FilesInDirectory(...) から返されたファイルのリストに対して要素ごとに使用できる関数です。
次のようなファイル名をフィルターに渡すことができます。
??リンゴ*梨*.csv
各 ?は 1 に一致し、各 * は 0 以上に一致します。w9apple_fig_pear_grape.csv が一致します。
おそらくこのようなものを使用できます
list = files in directory("$desktop",recursive(1));
list = filtereach({name},list,contains(name,".txt"));
namefilterdata = concatitems(list,";");
MFI 名フィルターに渡す値を作成します。
MFI 括弧内の <Re: 複数ファイルのインポート、ファイルのフィルタリング
!Contains(part, "Tomato") または Contains(part, "Apple") を追加すると、検索しているフォルダー内のファイルの検出をループしてスクリプトが停止します。 データのインポートが実際に行われることはありません。 なぜこれが起こっているのかについて何か考えはありますか?
ここにコードをコピーしたいのですが、何らかの理由で常にスパムとして報告されます
Re: 複数ファイルのインポート、ファイルのフィルタリングこんにちは。
スクリプトに Contains を追加するとすぐに、フォルダー内のファイルを見つけるためにループし続け、データはインポートされません。 任意のヒント?
Multiple File Import(
<<SET folder=""></SET>
Re: 複数ファイルのインポート、ファイルのフィルタリングjthさん、ご返信ありがとうございます!来週初めまでにテストして、ご連絡させていただきます。
複数ファイルのインポート、ファイルのフィルタリングまず、ファイルのリストを取得します。 JMP でこれを行うには多くの方法があり、どれを使用するかは、速度要件 (および考えられるデータ要件) によって異なります。使用できるファイルのリストを取得するには、オペレーティング システム コマンドを使用できます (たとえば、Windows コマンド ラインには dir があり、powershell にはget-childitem (docs.microsoft.com)ファイルリストを取得するか、JMP で直接取得するには、Files In Directory() または Multiple File Import() を使用します (「ディレクトリ ツリー: フォルダーによって使用されているスペースを調査するMFI の例の場合)。
リストまたは JMP データ テーブルにファイルのリストを作成したら、何らかのアルゴリズムを使用してファイルのフィルタリングを開始できます。 以下にいくつかのアイデアを示します。
- Ends With() を使用して文字列の終わりを確認します
- Contains() を使用して特定の文字列を確認し、!Contains() を使用して他の文字列を除外します
- 同一のセグメントの場合 (一般的な単語が 1 つだけなのか、単語の組み合わせなのか、特定の順序の単語なのか...)ここでは Words() と Associative Arrays() が役立つ可能性が高くなります。
- その他のアイデアについては、「文字関数のスクリプト インデックス」セクションを参照してください。
データテーブルがどのように使用されるかがわからないと、ファイルの初期リストをロードするオプションの方法以外に、追加の質問について適切なヒントを提供するのは少し困難です。 オプションの 1 つは、ユーザーが必要なときにすぐに使用できるように、いくつかのスケジュールされたタスクを含むデータテーブルを作成することです。