同じ構造を持つフォルダーから csv ファイルを抽出して連結する<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、
たとえば、共通の名前を持つさまざまなフォルダーに大量の CSV ファイルがあり、CSV ファイルは同じ構造になっています。
<1 番目のフォルダー>dfgdwgssd
<共通名を持つ 2 番目のフォルダー> commonname
xxx-共通名.csv
スクリプトを使用して、すべての csv ファイルを抽出して連結しようと考えています。 bash コマンド (「for」ループと「find」) を使用した簡単な方法を見つけました。誰か手伝ってくれませんか? どうもありがとうございます!
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するもう一度ありがとう、フィル!
私は Mac を使用していますが、Google で検索したところ、JMP からシェルを実行することに関する情報がほとんど見つかりませんでした。いくつかの例はありますか?
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するもちろん嬉しいです! 私が指摘しようとしていたのは、JMP を使用してファイルのリスト全体を取得し、REGEX を使用して を含むファイル名を検索できるということです。 確かに、1300 以上のフォルダーがあると、時間がかかることが想像できます。
速度に関するいくつかのヒント:
- ログに出力すると速度が低下します。
- また、各ファイルを連結して閉じる前に、最初にすべてのファイルを開いてください。
※Macをお使いの場合は、JMPからシェルスクリプトを起動できます。 Windows では、Cygwin などを使用していない限り、Powershell は JMP から呼び出すことができるユーティリティ プロシージャを作成するのに適したオプションです。
フィル
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するこんにちは、フィルさん
ヒントをありがとうございました! ただし、私はあなたのスクリプトを実行しませんでした。
試しに少量のフォルダーを使用していましたが、大量のフォルダー (たとえば >1,300) を使用すると時間がかかることに後で気づきました。JMP が 2 番目のディレクトリに移動して *.csv ファイルなどを抽出するため、非常に時間がかかります。消費するけど。
効率を上げるために、bash を使用してすべての csv ファイルをフォルダーに移動し、それらを連結することを考えました。 bash を使用してこれ (CSV ファイルの抽出と連結) を 1,300 を超えるフォルダーで行う簡単なチェックでは、13MB の連結 CSV ファイルで 3 秒かかりました。 JSL 内で bash コマンドを実行できるかどうかを検討する必要があります。
ところで、
dt = Open( dirpath || TheFileList,invisible );
処理中にデータテーブルはポップアップしません
ありがとうございました!
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するこんにちはじいさん、
Jim の提案に加えて、必要なファイルを選択するために次の一般的なアプローチを試すこともできます。 たとえば、以下を参照してください。
allFiles = FilesInDirectory("$Documents", recursive);
selectedFiles = {};
commonName = "BrownP";
For( i = 1, i<=NItems(allFiles), i++,
If( !IsMissing( Regex(allFiles, EvalInsert(".*<COMMONNAME>.*\.csv","<",">" )) ),
InsertInto(selectedFiles, allFiles);
)
);</COMMONNAME>
1. 「マイ ドキュメント」フォルダとそのサブフォルダ内のすべてのファイル名を取得します。 (最上位フォルダーのパスに置き換えてください)。
2. 必要なファイル名を保存する空のリストを作成します。
3. commonName 文字列を定義します。
4. すべてのファイル名をループし、パターンに一致するものだけを選択してファイル名に保存します。選択されたファイルリスト。 この例ではファイル名に「BrownP」を含むすべての CSV ファイルを取得しています。 (独自の commonName 文字列に置き換えます)。
したがって、完全な実装は次のとおりです (前回の投稿の Jim のコードを使用)。
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Define common string to search for
commonName = "file";
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( !Is Missing( Regex( TheFileList, Eval Insert( ".*<COMMONNAME>.*\.csv", "<", ">" ) ) ),
dt = Open( dirpath || TheFileList );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
)
);</COMMONNAME>
お役に立てれば!
最高、
フィル
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結する
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
If( Contains ( TheFileList[i], "<2nd folder common name"),
If( Contains (TheFileList[i],"<COMMON name="" of="" the="" csvfile="">"),
print(TheFileList[i]);
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);
);
);</COMMON>
機能させるにはさらに 2 行追加しますが、配置/インデントを調整する必要があります。
ありがとう!
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するはい、第 2 レイヤーと CSV ファイルの両方の「共通名」が何であるかは知っています。 ありがとう!
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結する「通称」が何なのか、事前に知っていますか?それともスクリプトにそれを理解させる必要がありますか?その場合、フォルダー内に複数の共通名が見つかる可能性がありますか?
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結するこんにちは、ジムさん
動作するようになりましたが、すべての CSV ファイルが一覧表示されました。2 番目のレイヤーを並べ替えたり指定したりする方法を見つけようとしています。もう少しヒントを教えていただけますか?
ありがとう!
Re: 同じ構造のフォルダーから csv ファイルを抽出して連結する以下に、良いスタートを切るためのスクリプトを示します。
Names Default To Here( 1 );
// Setup an empty table to start to concatenate other tables to
dtbase = New Table( "Base Table" );
// Have the user select the starting folder
dirpath = Pick Directory( "Pick the Top Level Directory" );
// Get all of the files in all of the folders that are under the picked folder
TheFileList = Files In Directory( dirpath, "recursive" );
// Go through all of the files and read in append those that meet your
// requirement. You will need to amend the IF statement to meet your criteria
For( i = 1, i <= N Items( TheFileList ), i++,
If( Uppercase( Word( -1, TheFileList[i], "." ) ) == "CSV" & Is File( dirpath || TheFileList[i] ) == 1,
dt = Open( dirpath || TheFileList[i] );
dtbase = dtbase << concatenate( dt, append to first table( 1 ) );
Close( dt, nosave );
);
);