質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

Q&A

解決済

4回答

13074閲覧

phpMyAdminでテーブルへcsvファイルのインポートが失敗する

chi_tana

総合スコア19

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

phpMyAdmin

phpMyAdminはオープンソースで、PHPで書かれたウェブベースのMySQL管理ツールのことです。

0グッド

1クリップ

投稿2016/11/30 04:00

編集2016/11/30 04:02

###前提・実現したいこと
phpMyAdminにcsvデータをインポートする。
csvデータは国交省からダウンロードしたものです。
最初にインポートして失敗したときに、テーブルは作成されました。はじめの1000行以上はインポートに成功しています。
失敗したレコードから再度取り込むとうまくいくのですが、また1000レコードほど読み込んで失敗します。レコード数が30万ほどあるのでその都度行うのは現実的ではありません。

###発生している問題・エラーメッセージ
いつも同じ行でインポートが失敗します。

CSV 入力の書式が不正です (行: 1534)。

###該当のcsvデータ
失敗するデータ

"東京都","千代田区","紀尾井町","6","9","-35243.9","-9109.8","35.682288","139.732689","1","1","0","0"

インポートに成功しているデータ

"都道府県名","市区町村名","大字・町丁目名","街区符号・地番","座標系番号","X座標","Y座標","緯度","経度","住居表示フラグ","代表フラグ","更新前履歴フラグ","更新後履歴フラグ" "東京都","千代田区","麹町六丁目","5","9","-34965.0","-9246.0","35.684800","139.731181","1","1","0","0"

###試したこと
下記設定で取り込んでいます。

  • ファイルの文字セット:SHIFT-JIS
  • 部分インポート:1行
  • カラムの区切り記号:,
  • カラム囲み記号:"
  • カラムのエスケープ記号:\
  • 行の終端記号:auto

エンコーディングへの変換:SHIFT-JIS や全角カナ
への変換を試しても失敗しました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

まず問題を切り分けましょう。
該当の「失敗するデータ」をCSVファイル内の先頭行に持ってきて再度インポートしてみてください。

その結果を見て
・1行目で失敗する=その行の書式やデータに問題がある
・また1000レコードくらいまで行く=ファイルサイズや実行時間制限などそっち系の問題

投稿2016/11/30 07:18

zico_teratail

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chi_tana

2016/11/30 07:25

コメントありがとうございます。 はじめに止まったレコード自体が読み込めることは確認できました。
zico_teratail

2016/11/30 07:55

では次に進みます。 phpmyadminのインポートタブを開き、 テキストファイルの位置 ファイルを選択 (最長: *** kKiB) などと書いてありますので、ここの最長: *** kKiBの数字がどうなっているか教えてください。 また、「部分インポート」の項目のチェックなどはどういう設定になっていますか?
chi_tana

2016/11/30 09:20

テキストファイルの位置という文言はありませんが アップロードファイル:(最長: 100MiB)とあります。 csvファイルは先の回答者とのやりとりに記載していますが、27MBです。 各設定は試したこと欄に記載しています。 先頭レコードにカラム名があるので部分インポートは1行にしています
zico_teratail

2016/11/30 09:23

ではphpmyadminのアップロードサイズ設定は問題ないですね。 部分インポートの枠内に「制限時間が近くなったときにスクリプト側でインポートを中断できるようにします」という行とチェックボックスがありませんか? それとphpmyadminのバージョンはいくつですか? もしかしたら古いものをお使いかもしれませんね(今回の件と直接関係するかどうかはともかく、なるべく新しいものを使ったほうがいいと思います)。
chi_tana

2016/11/30 10:21

phpMyAdminは バージョン情報: 4.1.6, 最終安定バージョン: 4.6.5.1 とありました。 会社で使っているので、上司と相談ですね。。 インサートエラーで中断とありましたが、チェックしてもしなくても変わりませんでした。 記事ありがとうございます。ただ、先の回答者とのやりとりですでに設定変更、適用確認済みです。。
chi_tana

2016/12/02 04:01

返信遅くなりすみません、インポート時にエラーログには更新されませんでした。
zico_teratail

2016/12/02 05:52

なんだかもう袋小路に入っちゃったようだし、わざわざphpmyadminのインポート機能を使わずに自分でスクリプト書いたほうがよっぽど解決が早いのでは? CSV読んでDBに入れるだけの初歩的なものだから数行~数十行で書けるでしょう。 phpmyadmin使うより速度も出るし、いろいろな制限にも引っかかりにくくなると思われます。
chi_tana

2016/12/02 06:10

ありがとうございます、書き方調べてみます。
guest

0

php.iniファイルを開いて「memory_limit」「post_max_size」「upload_max_filesize」の値を確認してください。
で、インポートしようとしているCSVファイルの容量を確認してください。
どれかがファイルサイズより小さいようであれば、インポートに失敗すると思います。

また、「max_execution_time」の値も確認してください。
大量のデータを取り込むと実行時間が長くなりますが、そのせいでタイムアウトしている可能性があります。

それぞれ、値を大きめに設定して再度実行してください。
またエラーが起きたとしても、エラーとなる行が大きく変わる場合は見どころは悪くないはずですので、さらに値を大きくしてみてください。

投稿2016/11/30 04:30

kunai

総合スコア5405

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chi_tana

2016/11/30 04:36

すみません、php.iniはどこから参照するのでしょうか?
kunai

2016/11/30 04:45

サーバ環境によるので一概には言えません。 SSH等でサーバにログイン出来る環境はありますか? 何のことかわからんと言うのであれば、サーバがどこにあるのか(どのレンタルサーバ事業者のどういうプランか、或いはローカルPCのVirtualBox等仮想環境に置いたCentOS等)等、サーバ周りの情報を提示いただけますか。
chi_tana

2016/11/30 05:13

また、環境はCakePHP3, PHP7で開発を行っています。
chi_tana

2016/11/30 05:25

もしかしてこちらから設定を行うのでしょうか? https://heteml.jp/support/manual/phpini/ 諸事情により、すぐに確認したり設定を変えることはできないのですが upload_max_filesizeを確認してみたいと思います。
kunai

2016/11/30 05:48

あれ、なぜか書いたコメントが反映されてないっぽいですね? 部分的にでもphp.iniが編集できるようですので、そちらで対応出来そうですね。 参照先のURLを見る限りでは max_execution_time max_file_uploads max_input_time あたりも見てもらった方がいいと思います。
chi_tana

2016/11/30 06:25

コメントありがとうございます。 csvファイルのサイズは約28MBなのですが、upload_max_filesizeを50MBにしても失敗しました。 試しに先頭の10レコードを消して読み込んでみましたが、同じレコード数を読んで失敗するのでやはりファイルサイズ絡みな気がしました。 教えていただいた項目も確認させていただきます。
chi_tana

2016/11/30 07:06 編集

下記の設定を行って再度チャレンジしましたが、状況変わりませんでした。 max_execution_time=120 max_file_uploads=100 max_input_time=120 「memory_limit」については128MBに固定されているようなので問題ないとおもうのですが。。 https://heteml.jp/info/detail/id/1421 何か改善点がありましたらご教示ください。
kunai

2016/11/30 07:26

max_execution_time=120 と言う事は、2分後にエラーになる感じですかね? であれば、さらに時間を延ばすか、2分で終わる程度の行数(エラーになっているあたりの少し手前)でファイルを分割して、一つずつ実行していけば通るように思います。
chi_tana

2016/11/30 07:31

いえ、設定変更後もアップロード完了後、数秒でエラーが帰ってきました。 止まったレコード自体はインポートできることを確認していますので、やはりファイルサイズ関係だとは思うのですが。。 解決しなければおっしゃる通り、数は多くなりますがファイル分割して取り込むことを考えます。
kunai

2016/11/30 07:48

先程のphp.iniのマニュアルページ最下部にも書いてありますが、php.iniの設定が反映されたかどうか、phpinfo();を使って確認してみてください。 設定出来ない「post_max_size」あたりが小さいんじゃないかなとも思いますので、ついでに確認いただけると。
chi_tana

2016/11/30 10:11

見落としていました、ありがとうございます。 きちんと設定されていました。post_max_sizeはupload_max_filesizeと同じ値に自動設定されていました。(マニュアルページにある通り) 再度試しましたが、うまく行きませんでした。 また、いつも止まるレコードを消したら300レコードほど多く取り込めていました。しかもエラーなしでしたが、1,800/30万なので結局止まっているようでした。
guest

0

国土地理協会のデータですかね…

以前使っていたときは、phpMyAdmin じゃ、非力なので、FTPでサーバーに上げた後で、mysqlコマンドを書いたシェルスクリプトで対応しました。

処理の順番は
nkfで文字コード変換
mysqlにインポート

投稿2016/12/02 06:20

編集2016/12/02 06:22
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

ダメ元でこちらのサイトのやり方を参考にしたら読み込めました!
http://singoro.seesaa.net/article/195209992.html

・csvの文字コードをUTF-8(BOM無し)に変換
・「CSV using LOAD DATA」を選択し、「フィールド区切り記号」を「;」から[,」に変更する。

なぜこの設定でできたのかはわかりませんが、ひとまず解決しました。
お二方ともたくさんご教示いただき、本当にありがとうございました。

投稿2016/12/02 06:17

chi_tana

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zico_teratail

2016/12/02 06:46

良かったですね。 今回のケースに限らず、SHIFT-JISっていろいろ面倒なのでなるべく全てをUTF-8に統一して使うクセをつけておくと無駄なトラブルが減るかと思います。
chi_tana

2016/12/03 02:28

そうなんですか、勉強になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問