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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

1316閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

CSV

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2020/02/17 07:02

編集2020/02/19 04:49

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

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ファイルには存在しないカラムを、データベース登録時に最終カラムに追加しながら登録していく方法は無いものでしょうか。

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

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

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

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

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

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

Orlofsky

2020/02/17 07:09

>某プログラム とは? 無意味に情報を隠すとまともな回答は付きません。
yoorwm

2020/02/17 07:11

大抵の場合、phpMyAdminで適切にオプション設定してインポート出来るものなので、何が問題なのかを書いてください。 というか、CREATE TABLE文とインポート出来ないCSVのサンプルを添付するといいかと。
Orlofsky

2020/02/17 07:13

>最初の行にはタイトル行が自動挿入される 最初の行の情報でCREATE TABLE したいということでしょうか? テーブル名や各列のデータ型や桁数はどこから持ってくるのですか?
退会済みユーザー

退会済みユーザー

2020/02/17 07:22

某プログラムとは、就労関係のソフトなのですが、ソフトウェア名を記載するのはどうなのかと思って濁しましたことをご容赦ください。
coco_bauer

2020/02/17 07:28

「手作業でタイトル行を削除してインポート」すると成功するということは、CSVファイルの1行目(タイトル行)のカラム数と、2行目以降のカラム数が一致していないのではないですか? 質問にそのCSVファイルの1行目と2行目を追加して下さい。 「出力形式を選ぶ際、『カンマ区切りのみ』しか指定できない」プログラムで、"出力形式を選ぶ際"って有りうるのですか?
退会済みユーザー

退会済みユーザー

2020/02/17 08:01

(Excelではなく)CSVエディタやCSV読み込み対応エディタが世の中に存在するので、そういうので開いてCSVの完全性を検証するとよいのではないかと。Windowsならあすかぜ・ねっとさんのCassavaがお手軽です。
退会済みユーザー

退会済みユーザー

2020/02/17 08:04

手作業でタイトル行を削除してなら、一応インポート動作自体はできるのですが、本来130レコード近くあるはずなのに5レコードしか登録できないという不具合があります。 しかしながら、現状はまず”登録すること”を優先しようと思って、あえて書きませんでした。 また、おっしゃる通り、出力形式は実際選ぶことができませんでした。CSVファイルとしてだけ保存できるほか、そのプログラム専用の書式の2パターンのみでした。
退会済みユーザー

退会済みユーザー

2020/02/17 08:09

自作プログラムでのCSV出力が安定していない以上、CSV読み込みの検証をするだけ無駄な手間になるのでは?
退会済みユーザー

退会済みユーザー

2020/02/17 08:14

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

2020/02/17 09:11

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

退会済みユーザー

2020/02/17 09:48

大変申し訳ありません。CSVファイルは、ファイル名が文字化けしているだけで、名前を適度に変更していただければ大丈夫です。 また、phpMyAdminでインポートする際、文字コードを指定しない(UTF-8)でインポートすると、全部インポートします。(CSVファイルは”Shift-JIS”のため、登録されたデータは文字化けになります)
guest

回答4

0

sql

1 `36str` int(2) DEFAULT 0 COMMENT 'おかずのみ注文'

csvの36str

1休2代深 20:00

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

投稿2020/02/17 11:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/02/17 12:58 編集

ホントだ、おかずのみ注文、どこからでてきたw
退会済みユーザー

退会済みユーザー

2020/02/19 04:33

ご指摘いただきありがとうございます。 もともと”休2代深”は『時間型』のものだったのですが、実質的には使用していなかったため、その後の処理で”おかずのみ注文”を手入力で書き換えるつもりで設定していました。データベースでは、そういった曖昧なことができないのですね。初めて知りました。 だとしたら、CSVファイルには設定されていない37番目のカラム`37str`の用意が必要なのでしょうか。 その場合、実際のCSVファイルには存在しないカラムになってしまうので、どのように処理したら良いのでしょうか。
退会済みユーザー

退会済みユーザー

2020/02/19 06:18

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

0

ベストアンサー

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

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

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

投稿2020/02/19 06:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

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

投稿2020/02/17 10:55

編集2020/02/17 11:36
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/02/17 11:18

phpMysql(廃止されたエクステンション)?
退会済みユーザー

退会済みユーザー

2020/02/17 11:36

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

0

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

投稿2020/02/17 07:26

yambejp

総合スコア114581

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

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

yambejp

2020/02/17 07:34 編集

CSVが不正なら、VBSなどでいらない1行目を削除したり、 エンクロージャを設定したりするようなプログラムをかけば ちゃんとしたCSVになると思います PHPを介するなら先頭行を無視してfgetcsvで処理すればよいかも
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問