1

MySQL データベースにインポートする必要がある大量のデータがあります。私はコンマとタブ区切りのデータをインポートすることに慣れていますが、これは異なります。以下の最も簡単な用語でフォーマットを説明しようとします.

したがって、次のようになります。

XXX XXX XXX

または次のようになります。

XXX X XXX

または次のようになります。

XX XX

スペースが正しく表示されることを願っています。その場合、スペース、タブ、またはコンマで区切られた 3 つのセクションではなく、各文字に割り当てられたスペースがあることがわかります。(技術的にはスペースで区切られていますが、異なる番号で区切られています)。

私がする必要があるのは、文字 1、2、および 3 が DB の field_1 に入るということです。文字 4 は常に空白で、文字 5、6、および 7 は field_2 に入ります。基本的に、各セクションはそれぞれのフィールドにある必要があります。

ここで、それをすべて 1 つのフィールドとして一時テーブルにインポートし、おそらく SUBSTR() を使用してこのデータを上記の正しい形式に配置できると思います。

しかし、それは少し長引いているようです。

これを行うより良い方法はありますか?追加の手順を実行せずに、テキスト ファイルから DB の正しい形式に直接インポートしたいと考えています。

ありがとう

4

2 に答える 2

0

PHP の substr() ルートを試してみましたが、うまくいきましたが、各行をループするデータを処理するのに時間がかかり、数十万のレコードを処理する必要があることを考えると、遅すぎると感じました。

別の方法として、データを非常に迅速に処理する次の単純な SQL ソリューションを見つけました。

LOAD DATA LOCAL 
    INFILE 'fixed-width-data.txt' 
INTO TABLE 
    my_table (@line)
SET 
    field_1 = SUBSTR(@line,1,3),
    field_2 = SUBSTR(@line, 5,3),
    field_3 = SUBSTR(@line, 9,3)    
于 2012-05-25T12:05:48.543 に答える
-1

substr()は 1 つのオプションですが、正規表現を使用する方がエレガントな場合があります。1 から 3 までの文字が 1 つのフィールドで、5 から 7 までが別のフィールドである例では、…</p>

preg_match('/^(.{3}).(.{3})$/', $line_of_data, $matches);
$field_one = $matches[1];
$field_two = $matches[2];

これは明らかに単純化された例ですが、操作するデータの「フィールド」が多数ある場合は、長い目で見れば、何度も何度も操作する代わりに正規表現を使用substr()する方がはるかに快適であることがわかると思います。

于 2012-05-22T13:20:05.817 に答える