MySQLはCSVデータからNULL値をロードします


167

カンマで区切られた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 | |
+ ------- + -------- + ------ + ----- + --------- + ------- +

MySQL LOADコマンドを使用してデータをロードしようとしています:

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の列 'four'の '' |
| 警告| 1261 | 行3にすべての列のデータが含まれていません|
| 警告| 1261 | 行3にすべての列のデータが含まれていません|
+ --------- + ------ + -------------------------------- ------------------------ +

このようなデータスキーマの変更では、実行前にすべての列を整列するd6tstackを使用しますLOAD DATA。データスキーマの変更については、d6tstack SQLの例のセクションを参照してください。
citynorman 2018年

回答:


193

これはあなたが望むことをします。ローカル変数に空の文字列が含まれている場合、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,'')
;

理論的には、私は推測しますが、すべてメモリ内にあり、行ごとに少量のデータしか保持しないため、イメージは非常に小さいものになると思います。問題があると思われる場合は、テストする必要があります。
Duncan Lock

4
私はこの答えが本当に好きです。Excelの''csv(クエリIFNULL(Col,'')SELECT INTO OUTFILE使用)をダウンロードすると、ユーザーは空の文字列を表示できますが、アップロードではそれらをnullとして受け入れるか\N、csvで処理する必要があります。ありがとう!
chrisan 2013

9
日付のI 'はNULLIF(STR_TO_DATE(@ DATE1、 "%D /%M /%Y")、 "0000-00-00")を'使用
ホアキンL.ロブレス

1
0変換する必要のあるゼロNULL(問題のデータにゼロ値を設定することができないため)と空の文字列を含むcsvファイルがあります。ゼロと空の文字列の両方が確実に変換されるようにするにはどうすればよいNULLですか?
Paul Rougieux 2017

ゼロ値と空の文字列が別々の列にある場合は、空の文字列に対して上記を実行し、ゼロについては次のようにしますnullif(@vone, 0)
ダンカンロック

136

MySQLマニュアルによると:

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

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

1,2,3,4,5
1,2,3,\N,5
1,2,3

3
ヒントをありがとう-私は生のソースデータを編集することに懐疑的ですが、これがそれを回避する唯一の方法である場合、私はそれを試します。
Spiros 2010

7
私はあなたの懐疑を理解しています、生データを編集するのが好きな人はいません。ただし、少し考えてみると、NULLと空の文字列を区別する方法が必要です。空白のエントリをNULLに変換する場合は、空の文字列用の特別なシーケンスが必要になります。これは、しかし、空白のエントリを処理する方法MySQLを伝えるためにどのような方法があると便利、TABLE武のTREAT BLANKS AS NULL INTO LOAD DATA INFILE「/tmp/testdata.txt」のような何か...だろう
Janci

2
あなたが持っている場合はOK、しかしFields enclosed by: "それである"\N""name",\N,"stuff"
ジョナサン

3
少なくとも "phpMyAdmin 3.5.5"について\Nは、を示すスタイルが受け入れられないことを確認できNULLます。代わりに使用してNULL、この例のように、:"name","age",NULL,"other","stuff"
ジョナサン

1
MySQL 5.5.46-0 + deb8u1があります。NULLと\ Nの両方を試しましたが、\ Nだけが機能しました。
raphael75 2016年

6

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

mysql> show variables like 'sql_mode';

ありがとう!昨日本番サーバーに正常にインポートした空の列を含むCSVをインポートしても、まったく新しいローカルインストールで機能しなかった理由を理解しようと頭を悩ませていました。これが私の場合の答えでした。
エマバロウズ2016年

3

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

正規表現を試す:s / ,, // \ n、/ gおよびs /、$ /、\ N / g

幸運を。


1
この正規表現は、部分的に、それは例えば,,,,となり、シーケンシャル空白のエントリを解決しない、動作します\ nは,, \ nはあなたがそれを2回実行した場合、使用可能であるべき
ievgen

1
回答と前のコメントを要約します。次の順序で私のために働いた:sed -i 's / ,, /、\ N / g' $ file、sed -i 's / ,, /、/ g' $ file、sed -i 's / \ N、$ / \ N / g '$ file、
Omar Khazamov

これを行いたいのですが、この正規表現をどのように実行しているかはわかりません。MySQLを使用してこれをファイルに対して実行する場合、これが最善の解決策になります。しかし、あなたは言わないでください。そして、私が不可能かもしれない何かをする方法をグーグルするのにたくさんの時間を費やしたくありません。
DonkeyKong

1

(variable1、@ variable2、..)SET variable2 = nullif(@ variable2、 '' or '')>>任意の条件を置くことができます


0

変数を表示

Show variables like "`secure_file_priv`";

注:上記のコマンドで指定した場所にcsvファイルを保存してください。

create table assessments (course_code varchar(5),batch_code varchar(7),id_assessment int, assessment_type varchar(10), date int , weight int);

注:ここで、「date」列にはcsvファイルのいくつかの空白値があります。

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/assessments.csv' 
INTO TABLE assessments
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS 
(course_code,batch_code,id_assessment,assessment_type,@date,weight)
SET date = IF(@date = '', NULL, @date);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.