0

列数が異なり、スペースで区切られた 30,000 以上のテキスト ファイルがあり、タスクはデータを列単位で 1 つの大きなオラクル テーブルにロードすることです。詳細と可能なアプローチは以下のとおりです。

テキストファイル 1-

Date Time SiteName CompName ipAdd
jkl mno pqr stu vwx

テキストファイル 2-

Date CompName ipAdd
abc def ghi

テキストファイル 3-

Date SiteName 
mno pqr

予想される Oracle テーブル -

Date Time SiteName CompName ipAdd
jkl mno pqr stu vwx
abc         def ghi
mno     pqr

ご覧のとおり、複数のテキスト ファイルにまたがる「同じ」列の数が異なります。そして、データを 1 つの大きなオラクル テーブルにロードする必要があります。

ご注意ください:

すべてのテキスト ファイルで、最初の列は常に 'Date' であり、列は順番に発生します。つまり、Date から Time..または Date から CompName... (Date から昇順)。

問題は、テキスト ファイルの 1 行目に名前が含まれている場合でも、2 つの異なるテキスト ファイルの 2 つの列と 15 列を区別できるように SQL Loader を使用する方法を見つけられなかったことです。それらを大きなテーブルに。

アプローチ:

  • すべてのテキスト ファイルを 1 つの大きなテキスト ファイルに結合し、何かを行う - 失敗
  • すべてのテキスト ファイル (25 列) の最大列数に区切り記号を付けようとしましたが、何かを実行できませんでした - できませんでした
  • 35,000 以上のテキスト ファイルを 35,000 以上のオラクル テーブルにロードし、これらの 35,000 以上のオラクル テーブルを 1 つの大きなテーブルに結合します - 私の周りの PPL によって推奨されましたが、スペースと時間/労力が非効率だったので、本当の代替手段を探します

最善の方法を教えてください。:-(

4

2 に答える 2

1

投稿された例が正確で、各ファイルの最初の行が列見出しであると仮定すると、ここでの一般的なアプローチが採用されます。(各ファイルの最初の行が列見出しでない場合は、かなり詰め込まれていると思います)。

Windows よりも *nix の方がはるかに簡単ですが、Powershell でこれらのタスクを処理できることを願っています (私は Powershell の人間ではありません)。

  1. 各ファイルの最初の行を読み取り、それをリスト ファイルとファイル名に書き込むシェル スクリプトを作成します。
  2. そのリスト ファイルの内容をすべての列で並べ替えます。これにより、すべてのファイル名が列ごとにグループ化されます。列の数を知るだけでは十分ではないため、これを行う必要があります。3 つの列を持つファイルと他のファイルがあると思いDate Time SiteNameますDate Time ipAdd
  3. リスト ファイル内の各グループにラベルを付けることをお勧めします。これは非常に面倒なので、テキスト プロセッサで自動化する価値はありますが、今のところどうすればよいかわかりません。
  4. 前の段階で識別された列の順列ごとに、ローダー ファイルを作成する必要があります。
  5. 次に、各テキスト ファイルを適切な制御ファイルとともにローダーに送信する必要があります。これが、各ファイル名にそのグループのラベルを付けることをお勧めする理由です。これにより、この段階の自動化が容易になります。

余談ですが、SQL Loader よりも外部テーブルを使用する方が簡単です。外部テーブルの DDL は、ローダー制御ファイルよりも簡単に記述でき、SQL を使用してクエリを実行できます。基本的に、外部テーブルはステージング テーブルですが、データはデータベースではなく OS ファイルにあります。

35,000 のステージング テーブルは必要ないことに注意してください。すべてのテキスト ファイルにまたがる列の個別の組み合わせごとに 1 つだけ必要です。もちろん、ターゲット テーブルに 25 の列があるとすると、可能な順列の数は非常に多くなりますが、実際には扱いやすい数であると仮定しましょう。

于 2012-05-16T17:10:47.857 に答える
0

ファイルの構造に一致するステージング テーブルにそれぞれをロードします。次に、SQL コードを使用してデータをクリーンアップし、最終的な本番テーブルに移動します。

別の方法として、ファイルを送付者に返却し、標準のファイル仕様に準拠している場合は受け取りを拒否します。

于 2012-05-16T16:36:03.760 に答える