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

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

ただいまの
回答率

89.06%

CSVファイルをMySQLに登録したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 331

heysister721

score 50

XAMPP+MySQL(MariaDB10.3.15)を使用しています。

CSVファイルをMySQLにPHP経由で登録したいと思っていますが、うまくいきません。

概要 

  • CSVファイルは某プログラムより出力されるCSVファイル
  • 既定件数は100件前後
  • カラム数:36
  • 出力形式を選ぶ際、『カンマ区切りのみ』しか指定できない。ダブルクォーテーションなどの『囲み文字』が利用不可。
  • 最初の行にはタイトル行が自動挿入される

やってみたこと

  1. phpMyAdminから指定テーブルにインポート。・・・中断「CSV 入力のカラム数が不正です 」
  2. phpMyAdminからデータベースに対して直接インポート・・・中断「CSV 入力のカラム数が不正です
  3. 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

    $dns = "mysql:dbname=general_works;host=localhost";
    $usr = 'root';
    $pas = '';
    $filepath = "../files/月次台帳.csv";
    $user = 'root';
    $password = "";

    try {
        $conn = new PDO( "mysql:host=localhost;dbname=general_works", $user, $password);
        $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        $e = "<p>データベースに接続しました。</p>";

        }

    catch(PDOException $e)
    {
        header('content-type: text/plain');
        die("データベース接続に失敗しました。: " . $e->getMessage() . "\n");
    }

    $stmt = $conn->prepare( "LOAD DATA INFILE $filepath INTO TABLE `timeworks` FIELDS TERMINATED BY ',' IGNORE 1 LINES; " );

    $stmt->execute();

?>


こんな感じにしてみました。

当初の予定では、最終カラムを時間型に定義しているものの、おかずのみの注文を集計するよう、整数型に変更して使用するつもりでいました。

これを皆様からのご指摘もあり、再利用できないことがわかり、再利用をあきらめて、別途「おかずのみ注文」のカラムを追加しようと思います。

この場合、CSVファイルには存在しないカラムを、データベース登録時に最終カラムに追加しながら登録していく方法は無いものでしょうか。

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • heysister721

    2020/02/17 17:14

    出力の方はすでに動作しています。

    phpMyAdminからCSVとしてインポートするのではなく、CSVファイルを書き換えてINSERT INTOで登録し、別途PHPのボタンをクリックするとダウンロードできるようになっています。

    キャンセル

  • coco_bauer

    2020/02/17 18:11

    添付された資料(.zipファイル)を展開してみたところ、読めない(字化けした)ファイル名のCSVファイル「譛域ャ。蜿ー蟶ウ_蛹ソ蜷・csv」が出てきました。
    某プログラムを動かしているPCの種類(Windows, Mac,Linux等)と、そこで使われている文字コードは、何でしょうか?

    インポートできる5レコードの一例と、インポートできないレコードの一例を示してもらえますか?

    キャンセル

  • heysister721

    2020/02/17 18:48

    大変申し訳ありません。CSVファイルは、ファイル名が文字化けしているだけで、名前を適度に変更していただければ大丈夫です。

    また、phpMyAdminでインポートする際、文字コードを指定しない(UTF-8)でインポートすると、全部インポートします。(CSVファイルは”Shift-JIS”のため、登録されたデータは文字化けになります)

    キャンセル

回答 4

+2

    `36str`    int(2)                            DEFAULT 0                                        COMMENT 'おかずのみ注文'
休2代深
0:00

型の不一致でエラーとなります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/17 21:57 編集

    ホントだ、おかずのみ注文、どこからでてきたw

    キャンセル

  • 2020/02/19 13:33

    ご指摘いただきありがとうございます。

    もともと”休2代深”は『時間型』のものだったのですが、実質的には使用していなかったため、その後の処理で”おかずのみ注文”を手入力で書き換えるつもりで設定していました。データベースでは、そういった曖昧なことができないのですね。初めて知りました。

    だとしたら、CSVファイルには設定されていない37番目のカラム`37str`の用意が必要なのでしょうか。
    その場合、実際のCSVファイルには存在しないカラムになってしまうので、どのように処理したら良いのでしょうか。

    キャンセル

  • 2020/02/19 15:18

    alter table timeworks alter 36str type time;
    alter table timeworks add 37str int(2);
    でいいかどうかはしらない(ぼくはPostgreSQL-erなのでMySQLまでは保証できない)

    キャンセル

check解決した方法

0

お忙しい中ご教授いただきました皆様、本当にありがとうございました。

私自身のスペックの低さにより、せっかく教えていただいたことが理解できずにいます。

一旦、この質問を閉じて勉強してみます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

単純にただしいcsvではないのでしょう。
一度当該テーブルにダミーデータを手入力してCSV出力してみてください
そのCSVと入力したいCSVのどこが違うか見比べるとよいでしょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/17 16:27 編集

    CSVが不正なら、VBSなどでいらない1行目を削除したり、
    エンクロージャを設定したりするようなプログラムをかけば
    ちゃんとしたCSVになると思います

    PHPを介するなら先頭行を無視してfgetcsvで処理すればよいかも

    キャンセル

0

CSVがSJISなのであれば、予めUTF-8で保存し直してからphpMyAdminにでもかければいいような気がするけど。
phpMyAdminがSJISってわけじゃないよねぇ。
なにかユニークキーの衝突でもあれば、成功しない可能性もあるけども。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/17 20:18

    phpMysql(廃止されたエクステンション)?

    キャンセル

  • 2020/02/17 20:36

    phpMyAdminのことを言いたかった(ので、訂正した

    キャンセル

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

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る