コンマで区切られた3〜4列の数値を含むファイルがあります。空のフィールドは、行の最後にある場合を除いて定義されます。
1,2,3,4,5
1,2,3,,5
1,2,3
次のテーブルがMySQLで作成されました。
+ ------- + -------- + ------ + ----- + --------- + ---- --- + |フィールド|タイプ|ヌル|キー|デフォルト|追加| + ------- + -------- + ------ + ----- + --------- +- ----- + |一つ| int(1)|はい| | NULL | | | 2 | int(1)|はい| | NULL | | | 3 | int(1)|はい| | NULL | | | 4 | int(1)|はい| | NULL | | | 5 | int(1)|はい| | NULL | | + ------- + -------- + ------ + ----- + --------- + ---- --- +
MySQL LOADコマンドを使用してデータをロードしようとしています:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
結果のテーブル:
+ ------ + ------ + ------- + ------ + ------ + |一つ| 2 | 3 | 4 | 5 | + ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
問題は、未加工データのフィールドが空で定義されていない場合、何らかの理由でMySQLが列のデフォルト値(NULL)を使用せず、ゼロを使用するという事実にあります。フィールドがすべて欠落している場合、NULLは正しく使用されます。
残念ながら、この段階でNULLと0を区別できるようにする必要がありますので、どんな助けでも歓迎します。
ありがとう.
編集する
SHOW WARNINGSの出力:
+ --------- + ------ + --------------------------- ----------------------------- + |レベル|コード|メッセージ| + --------- + ------ + ------------------------- ------------------------------- + |警告| 1366 |誤った整数値:行2の列 'four'の '' |警告| 1261 |行3にはすべての列のデータが含まれていません| |警告| 1261 |行3にはすべての列のデータが含まれていません| + --------- + ------ + --------------------------- ----------------------------- +
これはあなたが望むことをします。 4番目のフィールドをローカル変数に読み込み、ローカル変数に空の文字列が含まれる場合、実際のフィールド値をNULLに設定します。
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(one, two, three, @vfour, five)
SET four = nullif(@vfour,'')
;
それらがすべて空である可能性がある場合、それらをすべて変数に読み込み、次のように複数のSETステートメントを作成します。
LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = nullif(@vone,''),
two = nullif(@vtwo,''),
three = nullif(@vthree,''),
four = nullif(@vfour,'')
;
MySQLマニュアル 言う:
LOAD DATA INFILEを使用してデータを読み取る場合、空の列または欠落している列は ''で更新されます。列にNULL値が必要な場合は、データファイルで\ Nを使用する必要があります。状況によっては、リテラルの単語「NULL」も使用できます。
したがって、次のように空白を\ Nに置き換える必要があります。
1,2,3,4,5
1,2,3,\N,5
1,2,3
動作は、データベース構成によって異なります。厳格モードでは、これはエラーをスローするか、警告をスローします。データベース構成を識別するために、次のクエリを使用できます。
mysql> show variables like 'sql_mode';
入力CSVを前処理して、空のエントリを\ Nに置き換えます。
正規表現の試行:s/, /、\ n、/ gおよびs /、$ /、\ N/g
幸運を。