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

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

ただいまの
回答率

89.22%

カラム数の多い(200以上)csvをアップし、MySQLに保存したい

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,584

chapp

score 207

お世話になっております。
表題にあります、200以上の項目を有したCSVをlocalからアップロードし、MySQLに保存したいと考えています。

csvの形式は複数あるものの、納めるテーブルは1つなのでるため、CSVの項目とテーブルのカラムが一致していません。

簡単にinsert文であれば
INSERT INTO TableName ('0', ''.... 
となるのでしょうが、データの量(レコード数)含め、カラム数が200以上と多いので、どのような仕組みが効率が良いのか?そのフローなどご教示いただければと質問いたしました。

言語はPHP(7.1)で、mysqliにて作成しています。

お忙しい中恐縮ですが、アドバイスのほど頂戴出来れば幸いです。
よろしくお願い申し上げます。

■追記--------------------------------------------------------

形式の異なるCSVデータはそれぞれ別のテーブルに収めるべきとのご意見を伺いました。
誤った思考は避けたいところですが、具体的にどのような構成にすべきか?イメージが湧きません。
下記に現状の構成と、その理由を記載いたしますので、引き続きご教示いただければ幸いです。

取り扱いたいデータは不動産情報で、

・売買物件(販売中)
・売買物件(売却成約済み)
・賃貸物件(募集中)
・賃貸物件(入居成約済み)

など4つのカテゴリに別けられ、local内にあるCSVはこのカテゴリ毎に振り分けられています。

不動産情報なので、販売中の売買物件であれば、「販売価格」を筆頭に、マンションであれば「専有面積」、そして戸建てであれば、「土地面積」や「建物面積」などがあり、

制約済みの物件情報であれば「売却価格」、募集中の賃貸物件であれば「月額賃料」や「共益費」など、それぞれのカテゴリ、物件区分に応じた項目が存在し、イメージ的にCSVの内容は以下のような感じです。

・売買物件(販売中)
"物件番号","データ区分","物件区分","販売価格","有効期限"
"10010111","01","03","49800000","2018-8-30"
"10010121","01","02","85600000","2018-8-30"

・売買物件(売却成約済み)
"物件番号","データ区分","物件区分","成約価格","成約日"
"10010132","02","02","69800000","2018-8-30"
"10010139","02","04","28600000","2018-8-30"

・賃貸物件(募集中)
"物件番号","データ区分","物件区分","月額賃料","有効期限"
"10010212","03","03","98000","2018-8-30"
"10010245","03","02","48000","2018-8-30"

・賃貸物件(入居成約済み)
"物件番号","データ区分","物件区分","販売価格","成約日"
"10010111","04","02","128000","2018-8-30"
"10010121","04","02","88000","2018-8-30"

これらCSV(4種)をウェブ上のデータベースに保存するわけですが、1度の操作で検索する必要があることから、「物件情報」として1つのテーブルにデータを保存しようと考えたのが事の経緯です。

以上のことから、そのテーブルには、「販売価格」「成約価格」「月額賃料」「土地面積」「建物面積」「専有面積」など、それぞれのカテゴリ、それぞれの物件区分ならではのカラムを設け、CSVをアップするとき、(CSVはカテゴリ別に分けられているので)それぞれ適切なカラムに振り分けながら保存していく流れをイメージしています。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 4

+6

csvの形式は複数あるものの、納めるテーブルは1つなのでるため、CSVの項目とテーブルのカラムが一致していません。

この時点で、MySQLの機能性をほぼ捨てています。複数種類のデータを混ぜこぜで入れてしまえば、それは単なるデータ置き場にしかなりません。

そして、データの入れ方を考える上では、それをどのように使うかのほうが重要となります。「データをデータベースに投入」した後にどのように使いたいのかがわからないと、最適な構造は誰にも判断できません

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/30 13:23

    maisumakunさん

    ご親切なアドバイスをありがとうございます。
    「MySQLの機能性をほぼ捨てています」とのこと。良かれと思って設計したつもりでしたが、maisumakunさんをはじめ多くの方にご指摘を受け、「ならばどうしたら良いのか?」と考えているものの、なかなか良いイメージが浮かんできません。

    質問文に「追記」としてCSVの構成と現在までの経緯を書き込みましたので引き続きアドバイスのほど頂戴できれば幸いです。

    それと、「追記」内にも記載したCSVですが、項目数が200を超えるような構成となっており、CSVデータの取得・データの分解からinsertまで、こちらも併せてアドバイスいただけたら幸いです。

    お忙しい中恐縮ですが、よろしくお願い申し上げます。

    キャンセル

  • 2018/08/30 13:46

    「まとめて検索したい」のであれば、それ用に「検索用のインデックスデータを入れるためのテーブル」を立てて、あとは売買と賃貸に分けてテーブルを格納するかと思います。

    さすがに売買と賃貸ではデータが違いすぎて、共用するだけ負担になると思います。

    キャンセル

  • 2018/08/30 13:55

    maisumakunさん

    早々のお返事をありがとうございます。

    「検索用のインデックスデータを入れるためのテーブル」
    「売買と賃貸ではデータが違いすぎて、共用するだけ負担」

    なるほどですね。。具体的なイメージは湧きませんが、少し自身で考えています。

    取り急ぎ、御礼申し上げます。
    引き続きよろしくお願いいたします。

    キャンセル

+3

使い物になるシステムにするなら、データベースの正規化 をきちんと理解した上でデータ毎にテーブルを設計して、CSVもテーブル毎にデータを分けましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/30 19:14 編集

    Orlofskyさん

    お疲れの中、早々のお返事をありがとうございます。
    「ひとつのテーブルで売却済みって情報をUPDATEするのでは?」
    「賃貸なら部屋が空いたらまた貸すだろうから、同じ賃貸物件マスタに[入居中]って情報を設定して、空き物件検索の対象外とするのでは?」

    対象データが不動産物件なので、Orlofskyさんがご想像するのも無理もありませんが、CSVデータをアップする目的は、情報を共有し検索するのためであり、管理目的(アップしたデータを修正することはない)ではないのです。

    とはいえ私も知識不足なのは自覚しているので、皆さまの貴重なご意見を1つでも多く伺えれば、考えるきっかけになるかな・・と。

    貴重なご意見、お忙しい中でのご対応、ありがとうございました。

    キャンセル

  • 2018/08/31 07:14

    CSVでデータを管理するのは現実的とは思えません。データベースにデータを移行することを考えては?
    なお、mysqliよりはPDOの方がメジャーかと。

    キャンセル

  • 2018/08/31 13:50

    Orlofskyさん

    お世話になっております。ご親切な回答ありがとうございます。
    確かに周りを見渡せばPDOばかりが目につきます。それだけ当たり前ということですよね。考え直さなくては...

    今回のCSVは外部から入手するファイルで、それを自社内で共有するためのもので(もちろん2次利用はあるのでしょうが・・)、このデータを直接管理するようなイメージは今のことろ持ち合わせてはいません。

    Orlofskyさんをはじめ、teratailで多くの回答をされている方であれば、不動産物件情報と聞けば、より管理のしやすい構成を連想ゲームのようにイメージされるのかと思います。少し説明不足なところがあったかもしれません。失礼いたしました。

    キャンセル

+1

インターフェースの異なる形式を一つの形式に集約したいというのはままある話ですね。
データベースは正規化されたものを扱うのが得意ですから、ファイルを高速に扱える言語で整形してからDBに取り込むのが一番だと思います。
チェックなどは一時テーブルに流し込んで、その後に行うのでもいいでしょうし。

追記

ファイルを高速に処理できる言語として、以下参考にされて下さい。
8つの言語でテキストフィルタを書き比べた
速度に大差ないなら、簡単な記述で処理が行えるような保守性の高い言語を選択した方が良いと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/31 01:02

    追記見ましたが、これはレイアウトを整形後ですよね?

    キャンセル

  • 2018/08/31 13:37

    soziさん

    お忙しい中での回答、ありがとうございます。

    >別なテーブルにしなくて良いように、同一形式のCSVに纏めるんです。

    失礼しました。確かにそのように仰っていますね。「なるほど」と思いながら、お教えいただいたサイトも拝見しました。
    言語によって大きく違うものなのですね・・。私自身、使い分けるだけの知識も技量もありませんが、今後、関心をもって情報を取り入れていと思います。

    >追記見ましたが、これはレイアウトを整形後ですよね?

    追記にあるCSVの構成は例として記載いたしましたが、販売中のCSVと成約後のCSVは、項目数はともに200を超え、基本、項目内容と配置は異なる内容となっています。

    皆様のアドバイスから改めて構成を考えていますが、データ管理等は一切行わないので、今回のテーブルは1つにまとめて問題ないだろうと落ち着いているところです。

    話を戻しますが、soziさんの「これはレイアウトを整形後ですよね?」との発言が気になります。
    今一度、soziさんのお考え、お聞かせいただけたら幸いです。
    よろしくお願いいたします。

    キャンセル

  • 2018/09/06 22:46

    soziさん

    お返事ありがとうございます。この度取った手順は、格納するテーブルは1つとし、CSVファイルをアップした際、データを物件区分ごとに(カラムを指定し)整え、inseartしていく方法を取りました。

    物件区分ごとにテーブルを別けるべきとの貴重なご意見も頂戴していましたが、この度扱うデータは検索を行うだけど目的とし、管理目的は行わないことから、1つのテーブルとしました。

    最後までお気にかけて頂き、ありがとうございました。
    今後、また何かありましたらご質問させてください。
    よろしくお願いいたします。

    キャンセル

checkベストアンサー

0

最低でも種別の違うデータは別のテーブルに入れないとダメですね
それがダメなら、データを保持しておくだけを目的に
text型のデータで1カラムに全部流し込んでください

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/30 13:46

    契約前と後は合体できそうですね
    ・物件番号
    ・データ区分
    ・物件区分
    は共有でき、物件番号をもとに正規化してもよいでしょう

    販売価格と成約価格
    有効期限と成約日
    は上書きするか元データを保持しておくか運用によります

    売却と賃貸を合体させるなら
    あらたなカラムとして仮に「形態」をつくり売却または賃貸を保持します
    賃貸料金と売却料金欄は共用してもいいですが
    あえて分けたほうが集計しやすいかも

    キャンセル

  • 2018/08/30 13:59

    yambejpさん

    早々のお返事をありがとうございます。

    貴重なアドバイスをありがとうございます。
    データ量、カラム数が(私にしては)膨大なので、皆さんのご意見を頂戴しながら見直したいと思います。

    取り急ぎの御礼ですが、引き続き、よろしくお願いいたします。

    キャンセル

  • 2018/09/03 12:44

    解決されましたが、どのように決着されたのか不明ですね。
    気になる点としては、「text型のデータで1カラムに全部流し込んでください」を採用されているならそれは意味のないことです。
    なぜなら中身を取り出して編集するのなら、ファイルの時点で行うほうが効率的だからです。

    キャンセル

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

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