XAMPP+MySQL(MariaDB10.3.15)を使用しています。
CSVファイルをMySQLにPHP経由で登録したいと思っていますが、うまくいきません。
概要
- CSVファイルは某プログラムより出力されるCSVファイル
- 既定件数は100件前後
- カラム数:36
- 出力形式を選ぶ際、『カンマ区切りのみ』しか指定できない。ダブルクォーテーションなどの『囲み文字』が利用不可。
- 最初の行にはタイトル行が自動挿入される
やってみたこと
- phpMyAdminから指定テーブルにインポート。・・・中断「CSV 入力のカラム数が不正です 」
- phpMyAdminからデータベースに対して直接インポート・・・中断「CSV 入力のカラム数が不正です
- phpMyAdminからデータベースに対し、手作業でタイトル行を削除してインポート・・・インポート成功
確認したこと
- テーブル側のカラム数:36カラム CSVファイル側のカラム数:36
- phpMyAdminからインポートするとき、タイトル行の行数設定を”1”や”2”に設定するも、タイトル行が無視されずにインポートされる。
- CSVファイルを分解してphpMyAdmin経由で「INSERT INTO (...) VALUE (...)」で登録すると登録可能。登録したデータをもとに、集計結果をCSVデータでダウンロードできるようになっています。
添付ファイル
下記の通り、資料を添付いたします。
CSVファイルは、氏名部分を匿名にしていますが、内容はほぼ同一のものです。
合わせてテーブル構造をまとめたsqlファイルも併せて添付いたしました。
【追記】
皆様からの回答をいろいろ試していくうちに、バルクインサートの使い方の意味を履き違えていたようで、ファイルアップロード処理などを一部省略しましたが、『LOAD DATA INFILE $filepath INTO TABLE timeworks
FIELDS TERMINATED BY ',' IGNORE 1 LINES; 』を利用してみようと思います。
PHP
1<?php 2 3 $dns = "mysql:dbname=general_works;host=localhost"; 4 $usr = 'root'; 5 $pas = ''; 6 $filepath = "../files/月次台帳.csv"; 7 $user = 'root'; 8 $password = ""; 9 10 try { 11 $conn = new PDO( "mysql:host=localhost;dbname=general_works", $user, $password); 12 $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 13 14 $e = "<p>データベースに接続しました。</p>"; 15 16 } 17 18 catch(PDOException $e) 19 { 20 header('content-type: text/plain'); 21 die("データベース接続に失敗しました。: " . $e->getMessage() . "\n"); 22 } 23 24 $stmt = $conn->prepare( "LOAD DATA INFILE $filepath INTO TABLE `timeworks` FIELDS TERMINATED BY ',' IGNORE 1 LINES; " ); 25 26 $stmt->execute(); 27 28?>
こんな感じにしてみました。
当初の予定では、最終カラムを時間型に定義しているものの、おかずのみの注文を集計するよう、整数型に変更して使用するつもりでいました。
これを皆様からのご指摘もあり、再利用できないことがわかり、再利用をあきらめて、別途「おかずのみ注文」のカラムを追加しようと思います。
この場合、CSVファイルには存在しないカラムを、データベース登録時に最終カラムに追加しながら登録していく方法は無いものでしょうか。
よろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー