180

カンマで区切られた3〜4列の数値を含むことができるファイルがあります。空のフィールドは、行の最後にある場合を除いて定義されます。

1,2,3,4,5
1,2,3,,5
1,2,3

次の表はMySQLで作成されました。

+ ------- + -------- + ------ + ----- + --------- + ------- +
| フィールド| タイプ| ヌル| キー| デフォルト| エクストラ|
+ ------- + -------- + ------ + ----- + --------- + ------- +
| 1つ| int(1)| はい| | NULL | |
| 2つ| int(1)| はい| | NULL | |
| 3 | int(1)| はい| | NULL | |
| 4 | int(1)| はい| | NULL | |
| 5 | int(1)| はい| | NULL | |
+ ------- + -------- + ------ + ----- + --------- + ------- +

MySQLLOADコマンドを使用してデータをロードしようとしています。

LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "\n";

結果のテーブル:

+ ------ + ------ + ------- + ------ + ------ +
| 1つ| 2つ| 3 | 4 | 5 |
+ ------ + ------ + ------- + ------ + ------ +
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 0 | 5 |
| 1 | 2 | 3 | NULL | NULL |
+ ------ + ------ + ------- + ------ + ------ +

問題は、生データのフィールドが空で定義されていない場合、MySQLは何らかの理由で列のデフォルト値(NULL)を使用せず、ゼロを使用するという事実にあります。フィールドが完全に欠落している場合、NULLは正しく使用されます。

残念ながら、私はこの段階でNULLと0を区別できなければならないので、助けていただければ幸いです。

ありがとうS。

編集

SHOW WARNINGSの出力:

+ --------- + ------ + -------------------------------- ------------------------ +
| レベル| コード| メッセージ|
+ --------- + ------ + -------------------------------- ------------------------ +
| 警告| 1366 | 不正な整数値:行2の列'4'の''
| 警告| 1261 | 行3には、すべての列のデータが含まれているわけではありません|
| 警告| 1261 | 行3には、すべての列のデータが含まれているわけではありません|
+ --------- + ------ + -------------------------------- ------------------------ +
4

7 に答える 7

217

これはあなたが望むことをします。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,'')
;
于 2011-05-11T17:59:09.040 に答える
150

MySQL のマニュアルには次のように書かれています。

LOAD DATA INFILE でデータを読み取る場合、空の列または欠落している列は '' で更新されます。列に NULL 値が必要な場合は、データ ファイルで \N を使用する必要があります。状況によっては、文字通り「NULL」という単語も使用される場合があります。

したがって、次のように空白を \N に置き換える必要があります。

1,2,3,4,5
1,2,3,\N,5
1,2,3
于 2010-04-20T13:36:27.860 に答える
6

データベースの構成によって動作が異なります。厳密モードでは、これはエラーまたは警告をスローします。次のクエリは、データベース構成を識別するために使用できます。

mysql> show variables like 'sql_mode';
于 2015-01-22T17:10:39.147 に答える
3

入力 CSV を前処理して、空白のエントリを \N に置き換えます。

正規表現の試行: s/,,/,\n,/g および s/,$/,\N/g

幸運を。

于 2010-04-20T13:29:38.350 に答える
0

(variable1, @variable2, ..) SET variable2 = nullif(@variable2, '' or ' ') >> 任意の条件を入れることができます

于 2020-04-25T08:42:39.183 に答える