blog/content/post/2009-07-11-00001195.md

233 lines
15 KiB
Markdown

---
title: CSVファイルからDBにデータを登録する
author: kazu634
date: 2009-07-11
url: /2009/07/11/_1293/
wordtwit_post_info:
- 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4701;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}'
categories:
- mysql
---
<div class="section">
<p>
<a href="http://mysqlweb.net/category/4005373-1.html" onclick="__gaTracker('send', 'event', 'outbound-article', 'http://mysqlweb.net/category/4005373-1.html', 'MySQL初心者入門講座: Step4・ファイルからデータを取り込む');" target="_blank">MySQL初心者入門講座: Step4・ファイルからデータを取り込む</a>」を参考して、CSVファイルからデータをDBに登録してみました。
</p>
<h4>
作成するテーブル
</h4>
<p>
作成するのは次のようなテーブルです:
</p>
<table>
<tr>
<th>
項目番号
</th>
<th>
店名
</th>
<th>
住所
</th>
</tr>
<tr>
<td>
1
</td>
<td>
喫茶室ルノアール 池袋東口店
</td>
<td>
東京都豊島区東池袋1-40-2
</td>
</tr>
</table>
<h4>
用意したCSVファイル
</h4>
<p>
用意したのは次のcsvファイルです:
</p>
<pre>
1, 喫茶室ルノアール 池袋東口店, 東京都豊島区東池袋1-40-2
2, 喫茶室ルノアール 池袋パルコ横店, 東京都豊島区東池袋1-42-8
3, 喫茶室ルノアール 巣鴨駅前店, 東京都豊島区巣鴨1-15-1
4, 喫茶室ルノアール 本郷三丁目店, 東京都文京区本郷4-37-13
5, 喫茶室ルノアール 大崎ニューシティ店, 東京都品川区大崎1-6-4
6, 喫茶室ルノアール 中野北口店, 東京都中野区中野5-61-2
7, 喫茶室ルノアール 中野サンプラザ前店, 東京都中野区中野5-67-5
8, 喫茶室ルノアール 銀座2丁目店, 東京都中央区銀座2-7-18
9, 喫茶室ルノアール 西銀座店, 東京都中央区銀座2-5-5
10, 喫茶室ルノアール ニュー銀座店, 東京都中央区銀座2-8-15
11, 喫茶室ルノアール 銀座昭和通り店, 東京都中央区銀座2-11-6
12, 喫茶室ルノアール 銀座松屋通り店, 東京都中央区銀座3-3-11
13, 喫茶室ルノアール 銀座6丁目店, 東京都中央区銀座6-12-10
14, 喫茶室ルノアール 歌舞伎座前店, 東京都中央区銀座5-15-1
15, 喫茶室ルノアール 日本橋高島屋前店, 東京都中央区日本橋2-3-6
16, CafeRenoir 日本橋三越前店, 東京都中央区日本橋本町1-1
17, 喫茶室ルノアール 東京駅八重洲北口店, 東京都中央区八重洲1-6-17
18, CafeRenoir ニュー八重洲北口店, 東京都中央区八重洲1-7-4
19, 喫茶室ルノアール 大森駅前店, 東京都大田区大森北1-1-10
20, 喫茶室ルノアール 蒲田西口店, 東京都大田区西蒲田8-1-7
21, CafeRenoir 御徒町春日通り店, 東京都台東区上野6-1-1
22, 喫茶室ルノアール 上野しのばず口店, 東京都台東区上野4-10-7
23, CafeRenoir 上野公園前店, 東京都台東区上野2-13-13
24, 喫茶室ルノアール 日暮里谷中店, 東京都台東区谷中7-20-6
25, 喫茶室ルノアール 市ヶ谷駅前店, 東京都千代田区五番町
26, 喫茶室ルノアール 飯田橋西口店, 東京都千代田区富士見2-2-6
27, 喫茶室ルノアール 水道橋西口店, 東京都千代田区三崎町3-6-13
28, 喫茶室ルノアール 神田西口店, 東京都千代田区内神田2-9-9
29, 喫茶室ルノアール 神田北口駅前店, 東京都千代田区内神田3-21-8
30, 喫茶室ルノアール 神田南口駅前店, 東京都千代田区鍛冶町2-1-4
31, CafeRenoir 日比谷店, 東京都千代田区有楽町1-6-1
32, 喫茶室ルノアール ニュー秋葉原店, 東京都千代田区外神田1-16-10
33, 喫茶室ルノアール 秋葉原店, 東京都千代田区外神田1-11-6
34, CafeRenoir 秋葉原昭和通り口店, 東京都千代田区神田佐久間町1-18
35, 喫茶室ルノアール 阿佐ヶ谷駅前店, 東京都杉並区阿佐ヶ谷南2-14-10
36 喫茶室ルノアール 高円寺北口駅前店, 東京都杉並区高円寺北2-4-4
37, 喫茶室ルノアール 新宿西口エステックビル店, 東京都新宿区西新宿1-24-1
38, 喫茶室ルノアール 新宿西口駅前店, 東京都新宿区西新宿1-17-1
39, 喫茶室ルノアール 新宿ハルク横店, 東京都新宿区西新宿1-5-11
40, 喫茶室ルノアール 西新宿西鉄イン店, 東京都新宿区西新宿7-23-2
41, 喫茶室ルノアール 新宿3丁目ビッグスビル店, 東京都新宿区新宿2-19-1
42, 喫茶室ルノアール ニュー新宿3丁目店, 東京都新宿区新宿3-4-1
43, 喫茶室ルノアール 市ヶ谷外堀通り店, 東京都新宿区市谷田町1-3
44, 喫茶室ルノアール 四谷店, 東京都新宿区四谷1-3-22
45, 喫茶室ルノアール 新宿区役所横店, 東京都新宿区歌舞伎町1-3-5
46, 喫茶室ルノアール 新宿歌舞伎町店, 東京都新宿区歌舞伎町1-14-4
47, 喫茶室ルノアール 西武新宿駅前店, 東京都新宿区歌舞伎町1-26-6
48, 喫茶室ルノアール 新宿大ガード店, 東京都新宿区西新宿7-1-1
49, 喫茶室ルノアール 新宿小滝橋通り店, 東京都新宿区西新宿7-9-7
50, 喫茶室ルノアール 大久保店, 東京都新宿区百人町1-18-8
51, 喫茶室ルノアール 新大久保駅前店, 東京都新宿区百人町2-11-25
52, 喫茶室ルノアール ニュー高田馬場店, 東京都新宿区高田馬場2-18-6
53, 喫茶室ルノアール 高田馬場早稲田通り店, 東京都新宿区高田馬場2-14-2
54, 喫茶室ルノアール 高田馬場ビッグボックス横店, 東京都新宿区高田馬場1-34-8
55, 喫茶室ルノアール 高田馬場第一店, 東京都新宿区高田馬場1-34-12
56, 喫茶室ルノアール 代々木西口駅前店, 東京都渋谷区代々木1-30-6
57, 喫茶室ルノアール 千駄ヶ谷駅前店, 東京都渋谷区千駄ヶ谷1-30-8
58, 喫茶室ルノアール 渋谷南口店, 東京都渋谷区桜丘町15-15
59, 喫茶室ルノアール 渋谷シオノギビル店, 東京都渋谷区渋谷2-17-5
60, 喫茶室ルノアール 渋谷東急ハンズ前店, 東京都渋谷区宇田川町36-2
61, 喫茶室ルノアール 渋谷宮下公園店, 東京都渋谷区渋谷1-16-14
62, 喫茶室ルノアール 西日暮里第一店, 東京都荒川区西日暮里5-23-6
63, 喫茶室ルノアール 日暮里東口店, 東京都荒川区東日暮里5-51-11
64, 喫茶室ルノアール 赤坂見附店, 東京都港区赤坂3-10-2
65, 喫茶室ルノアール 新橋サンルート店, 東京都港区新橋4-10-2
66, 喫茶室ルノアール 新橋第一ホテル横店, 東京都港区新橋1-17-2
67, 喫茶室ルノアール 田町三田口駅前店, 東京都港区芝5-34-7
68, 喫茶室ルノアール 芝大門店, 東京都港区芝大門2-3-1
69, 喫茶室ルノアール 品川港南口店, 東京都港区港南2-3-29
70, 喫茶室ルノアール 品川高輪口店, 東京都港区高輪3-25-22
71, 喫茶室ルノアール 亀戸駅前店, 東京都江東区亀戸2-20-7
72, 喫茶室ルノアール 金町店, 東京都葛飾区東金町1-42
73, 喫茶室ルノアール 立川南口店, 東京都立川市柴崎町3-4-14
74, 喫茶室ルノアール 立川駅前店, 東京都立川市曙町2-13-10
75, 喫茶室ルノアール 立川店, 東京都立川市曙町2-9-1
76, 喫茶室ルノアール 三鷹北口駅前店, 東京都武蔵野市中町1-6-7
77, 喫茶室ルノアール 横浜元町店, 神奈川県横浜市中区元町1-18
78, 喫茶室ルノアール 横浜関内駅前店, 神奈川県横浜市中区港町2-6
79, 喫茶室ルノアール 横浜伊勢佐木町店, 神奈川県横浜市中区伊勢佐木町2-66
80, 喫茶室ルノアール 鶴見駅前店, 神奈川県横浜市鶴見区鶴見中央1-3-3
81, 喫茶室ルノアール 鎌倉駅前店, 神奈川県鎌倉市小町1-6-19
82, 喫茶室ルノアール 大船店, 神奈川県鎌倉市大船1-7-1
83, 喫茶室ルノアール 川崎銀柳街店, 神奈川県川崎市川崎区駅前本町3-3
84, 喫茶室ルノアール 京急川崎駅前店, 神奈川県川崎市川崎区砂子1-1-10
85, 喫茶室ルノアール 箱根湯本駅前店, 神奈川県足柄下郡箱根町湯本白石下706-35
86, 喫茶室ルノアール 川越店, 埼玉県川越市脇田町103
87, 喫茶室ルノアール 本八幡店, 千葉県市川市八幡2-6-15
</pre>
<h4>
とりあえず実践
</h4>
<p>
以下のようにして登録してみたのですが、なぜかうまくいきませんでした。
</p>
<pre class="syntax-highlight">
kazu634@kazu634-desktop% mysql -u root -p ~/work/googlemaps [<span class="synConstant">3036</span>]
Enter password:
Welcome <span class="synSpecial">to</span> the MySQL monitor. Commands <span class="synSpecial">end</span> <span class="synSpecial">with</span> ; <span class="synStatement">or</span> \g.
Your MySQL connection id <span class="synSpecial">is</span> <span class="synConstant">59</span>
Server version: <span class="synConstant">5.0</span>.<span class="synConstant">75</span>-0ubuntu10.<span class="synConstant">2</span> (Ubuntu)
<span class="synSpecial">Type</span> <span class="synConstant">'help;'</span> <span class="synStatement">or</span> <span class="synConstant">'\h'</span> <span class="synSpecial">for</span> help. <span class="synSpecial">Type</span> <span class="synConstant">'\c'</span> <span class="synSpecial">to</span> clear the buffer.
mysql&#62; <span class="synStatement">CREATE</span> <span class="synSpecial">TABLE</span> Shop (
-&#62; SHOP_CD INT(<span class="synConstant">3</span>),
-&#62; SHOP_NAME <span class="synType">VARCHAR</span>(<span class="synConstant">50</span>),
-&#62; PRIMARY KEY(SHOP_CD));
Query OK, <span class="synConstant"></span> <span class="synSpecial">rows</span> affected (<span class="synConstant"></span>.<span class="synConstant">01</span> sec)
mysql&#62; SHOW TABLES;
+<span class="synComment">------------------+</span>
| Tables_in_sample |
+<span class="synComment">------------------+</span>
| Shop |
+<span class="synComment">------------------+</span>
<span class="synConstant">1</span> <span class="synSpecial">row</span> <span class="synStatement">in</span> <span class="synStatement">set</span> (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
mysql&#62; use Shop;
ERROR <span class="synConstant">1049</span> (<span class="synConstant">42000</span>): Unknown database <span class="synConstant">'Shop'</span>
mysql&#62; <span class="synStatement">SELECT</span> * <span class="synSpecial">FROM</span> Shop;
Empty <span class="synStatement">set</span> (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
mysql&#62; LOAD DATA INFILE <span class="synConstant">&#34;data.csv&#34;</span>
-&#62; <span class="synSpecial">INTO</span> <span class="synSpecial">TABLE</span> Shop FIELDS TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;,&#34;</span>
-&#62; LINE TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;\n&#34;</span>;
ERROR <span class="synConstant">1064</span> (<span class="synConstant">42000</span>): You have an error <span class="synStatement">in</span> your SQL syntax; <span class="synSpecial">check</span> the manual that corresponds <span class="synSpecial">to</span> your MySQL server version <span class="synSpecial">for</span> the right syntax <span class="synSpecial">to</span> use near <span class="synConstant">'LINE TERMINATED BY &#34;\n&#34;'</span> at line <span class="synConstant">3</span>
mysql&#62; LOAD DATA INFILE <span class="synConstant">&#34;data.csv&#34;</span>
-&#62; <span class="synSpecial">INTO</span> <span class="synSpecial">TABLE</span> Shop FIELDS TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;,&#34;</span>
-&#62; LINES TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;\n&#34;</span>;
ERROR <span class="synConstant">29</span> (HY000): <span class="synSpecial">File</span> <span class="synConstant">'/var/lib/mysql/sample/data.csv'</span> <span class="synStatement">not</span> found (Errcode: <span class="synConstant">2</span>)
mysql&#62; LOAD DATA INFILE <span class="synConstant">&#34;~/work/googlemaps/data.csv&#34;</span>
-&#62; <span class="synSpecial">INTO</span> <span class="synSpecial">TABLE</span> Shop FIELDS TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;,&#34;</span>
-&#62; LINES TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;\n&#34;</span>;
ERROR <span class="synConstant">13</span> (HY000): Can<span class="synConstant">'t get stat of '</span>/etc/mysql/work/googlemaps/data.csv<span class="synConstant">' (Errcode: 2)</span>
<span class="synConstant">mysql&#62; LOAD DATA INFILE &#34;/home/kazu634/work/googlemaps/data.csv&#34;</span>
<span class="synConstant"> -&#62; INTO TABLE Shop FIELDS TERMINATED BY &#34;,&#34;</span>
<span class="synConstant"> -&#62; LINES TERMINATED BY &#34;\n&#34;;</span>
<span class="synConstant">ERROR 29 (HY000): File '</span>/home/kazu634/work/googlemaps/data.csv<span class="synConstant">' not found (Errcode: 13)</span>
<span class="synConstant">mysql&#62; LOAD DATA INFILE &#34;/home/kazu634/work/googlemaps/data.csv&#34;</span>
<span class="synConstant"> -&#62; INTO TABLE Shop FIELDS TERMINATED BY &#34;,&#34;;</span>
<span class="synConstant">ERROR 29 (HY000): File '</span>/home/kazu634/work/googlemaps/data.csv<span class="synConstant">' not found (Errcode: 13)</span>
</pre>
<h4>
そこで調べてみました
</h4>
<p>
どうやらカレントパス上のファイルを指定するためには、「LOAD DATA LOCAL INFILE」というように指定すればいいようです。すると、以下のようになって成功しました。
</p>
<pre class="syntax-highlight">
mysql&#62; load data local infile <span class="synConstant">&#34;data.csv&#34;</span> <span class="synSpecial">into</span> <span class="synSpecial">table</span> Shop;
Query OK, <span class="synConstant">87</span> <span class="synSpecial">rows</span> affected, <span class="synConstant">174</span> warnings (<span class="synConstant"></span>.<span class="synConstant">00</span> sec)
Records: <span class="synConstant">87</span> Deleted: <span class="synConstant"></span> Skipped: <span class="synConstant"></span> Warnings: <span class="synConstant">174</span>
mysql&#62; exit
Bye
</pre>
<h4>
まとめると
</h4>
<p>
カレントパス上のファイルを指定してDBに登録するためには次のように行います:
</p>
<pre class="syntax-highlight">
mysql&#62; LOAD DATA LOCAL INFILE <span class="synConstant">&#34;data.csv&#34;</span> <span class="synSpecial">INTO</span> <span class="synSpecial">TABLE</span> Shop
-&#62; <span class="synSpecial">INTO</span> <span class="synSpecial">TABLE</span> Shop FIELDS TERMINATED <span class="synSpecial">BY</span> <span class="synConstant">&#34;,&#34;</span>;
</pre>
</div>