7

次のように、バックスラッシュを含む MySQL テーブルにファイルをロードできるようにしたいと考えています。

Fred          Los Angeles        I am Fred
Nick          Madison            Great Lakes Whoo
JOHN          San Diego          Hello world!\
Bob           NYC                Big apple            

ユーザー JOHN\は列 3 の最後に a を置きました。これをテーブルにロードすると、MySQL はバックスラッシュをある種の行の継続として解釈し、行 3、列 3) を (行 4、列 1) と連結します。

このような何百万もの行があり、さまざまな場所にバックスラッシュがあり、大混乱を引き起こしているため、コピーして貼り付けて修正することはできません。

バックスラッシュを使用してタブ区切りファイルを MySQL テーブルにロードする適切な方法は何ですか? 各 (列) フィールドを引用符で囲む必要がありますか? 特殊文字を削除するパーサーを作成する必要がありますか?

4

2 に答える 2

7

ESCAPED BYファイルをロードするときにオプションを指定する必要があります。次の例では、フィールドがタブで分割され(デフォルトの動作)、ファイルがクライアントホストにあると想定しています。

LOAD DATA LOCAL INFILE '/path/to/file/my.txt' INTO TABLE t
FIELDS TERMINATED BY '\t' ESCAPED BY '\b';
于 2013-03-21T02:14:39.807 に答える
4

mysql load data infile ツールでバックスラッシュを飼いならす方法:

ステップ 1、テーブルを作成します。

mysql> create table penguin (id int primary key, chucknorris VARCHAR(4000));
Query OK, 0 rows affected (0.01 sec)

ステップ 2、インポートするファイルを作成し、このデータをそこに配置します。

1   aliens are on route
2   scramble the nimitz\
3   \its species 8472
4   \\\\\\\\\\\\\\\\\\
5   Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab

ステップ 3、テーブルに挿入します。

mysql> load data local infile '/home/el/foo/textfile.txt' into table penguin 
       fields terminated by '\t' lines terminated by '\n' 
       (@col1, @col2) set id=@col1, chucknorris=@col2;
Query OK, 4 rows affected, 1 warning (0.00 sec)
Records: 4  Deleted: 0  Skipped: 0  Warnings: 1

ステップ 4、そしてもちろん、この奇妙な出力が発生します。

mysql> select * from penguin;
+----+-----------------------------------------------------------------+
| id | chucknorris                                                     |
+----+-----------------------------------------------------------------+
|  1 | aliens are on route                                             |
|  2 | scramble the nimitz
3                                           |
|  4 | \\\\\\\\\                                                       |
|  5 | Bonus characters:!@#$%^&*()_+=-[]|}{;'":/.?>,< anything but tab |
+----+-----------------------------------------------------------------+

ステップ 5、警告を分析します。

mysql> show warnings;
+---------+------+--------------------------------------------------------+
| Level   | Code | Message                                                |
+---------+------+------------------------------------- ------------------+
| Warning | 1262 | Row 2 was truncated; it contained more data than there |
|         |      | were input columns                                     |
+---------+------+--------------------------------------------------------+
1 row in set (0.00 sec)

ステップ 6、何が悪かったのかを正確に考えます。

の左側にあるバックスラッシュnimitzにより、mysql ロード データ パーサーが 2 行目の末尾と 3 行目の先頭を連結しました。その後、タブにぶつかり、「nimitz\n3 を 2 行目にスクランブル」と入力しました。

its species 8472余分な単語がどこにも収まらないため、行 3 の残りはスキップされ、上記の警告が生成されます。

行 4 には 18 個のバックスラッシュがあるため問題はなく、それぞれがエスケープされているため 9 個のバックスラッシュとして表示されます。奇数があった場合、行 2 のエラーは行 4 に発生します。

5行目のおまけキャラは普通に出てきました。タブ以外はすべて許可されます。

ステップ 7、ペンギンのリセット:

mysql> delete from penguin;

ステップ 8、fields escaped by句を使用してテーブルにロードします。

mysql> load data local infile '/home/el/foo/textfile.txt' into table penguin 
       fields terminated by '\t' escaped by '\b' 
       lines terminated by '\n' (@col1, @col2) set id=@col1, 
       chucknorris=@col2;

Query OK, 5 rows affected (0.00 sec)
Records: 5  Deleted: 0  Skipped: 0  Warnings: 0

ステップ 9、テーブルから選択し、結果を解釈します。

mysql> select * from penguin;
+----+------------------------------------------------------------------+
| id | chucknorris                                                      |
+----+------------------------------------------------------------------+
|  1 | aliens are on route                                              |
|  2 | scramble the nimitz\                                             |
|  3 | \its species 8472                                                |
|  4 | \\\\\\\\\\\\\\\\\\                                               |
|  5 | Bonus characters:!@#$%^&*()_+=-[]\|}{;'":/.?>,< anything but tab |
+----+------------------------------------------------------------------+
5 rows in set (0.00 sec)

そして今、すべてが期待どおりです。2 行目の最後のバックスラッシュは、改行をエスケープしません。行 3の前のバックスラッシュiは何もしません。行 4 の 18 個のバックスラッシュはエスケープされません。そして、ボーナスキャラクターは大丈夫です。

于 2014-01-17T04:52:54.533 に答える