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

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

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

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

PHP

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

Q&A

解決済

2回答

470閲覧

phpでcsvデータをDBにインサートする

miya71ma

総合スコア49

MySQL

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

PHP

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

0グッド

0クリップ

投稿2019/06/17 01:41

編集2019/06/17 23:39

一日一回株価のcsvデータをアップロード(DBにインサート)するページを作成しています
ただ単にDBに値を入れるものは作成できているのですが'-'が入っていることがあり、その時にそのカラムには前日の同カラムのデータを入れるというロジックを組みたいのですが全くわかりません...
ご教授(ヒント)をいただけると幸いです。

**SC 名称 市場 業種 日時 株価 前日比 前日比(%) 前日終値 始値 高値 安値 VWAP 出来高 出来高率 売買代金(千円) 時価総額(百万円) 値幅下限 値幅上限 高値日付 年初来高値 年初来高値乖離率 安値日付 年初来安値 年初来安値乖離率
1 日経平均株価(日経225) 東証 株価指数 2019/6/14 15:00 21116.89 84.89 0.4 21032 21049.41 21119.73 20971.18 - - - - - - - - - - - - -
**
この場合2019/6/13 15:00のものを入れたい。データがない場合は0を入れる処理をしたい
(追記)
DBのテーブルは①SCをPKとした親テーブル、②csvがそのままインサートされるもの(下のcreate文のもの)、③②を使って絵結果を格納する(計算してインジケータ値などを格納したい)の三つです

/* トランザクション処理 */ $pdo->beginTransaction(); try { $fp = fopen($tmp_name, 'rb'); while (($row = fgetcsv($fp)) !== FALSE) { if ($row === array(null)) { // 空行はスキップ continue; } /*ここに"-"が格納されていた場合の処理を記載する*/ for($i = 0; $i <= 25; $i++){ if($row[i] === '-'){ $row[i]=0; } } /*echo($row[1]);*/ if (count($row) > 10000) { // カラム数が異なる無効なフォーマット throw new RuntimeException('Invalid column detected'); } $executed = $stmt->execute($row); } if (!feof($fp)) { // ファイルポインタが終端に達していなければエラー throw new RuntimeException('CSV parsing error'); } fclose($fp); $pdo->commit(); } catch (Exception $e) { fclose($fp); $pdo->rollBack(); throw $e; } コード

table

create

1 SC int(4) NOT NULL "証券コード", 2 name varchar(32) NOT NULL "会社名", 3 market varchar(16) NOT NULL "市場", 4 industry varchar(16) NOT NULL "産業", 5 date datetime NOT NULL "日にち", 6 today_close double "当日終値", 7 the_day_before_ratio double "前日との幅", 8 the_day_before_ratio_per double "前日幅%", 9 ago_close double "前日終値", 10 today_open double "始値", 11 today_high double "高値", 12 today_low double "安値", 13 vwap double "vwap", 14 volume double "出来高", 15 volume_per double "出来高%", 16 trading_value double "売買代金", 17 market_capitalization double "時価総額", 18 price_range_low_limit double "値幅下限", 19 price_range_high_limit double "値幅上限", 20 high_date datetime "高値日", 21 year_to_date_high_price double "年初来高値", 22 year_to_date_high_price_deviation_rate double "年初来高値乖離", 23 low_date datetime "安値日", 24 year_to_date_low_price double "年初来安値", 25 year_to_date_low_price_deviation_rate double "年初来安値乖離" 26 27); 28コード

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

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

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

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

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

m.ts10806

2019/06/17 01:45

「1日1回」とのことですが、「前日のデータが存在しない」というケースはありますか? 株については詳しくはないですが、休みの日があってその日はデータが入ってこないとかはあるのでしょうか。
m.ts10806

2019/06/17 01:46

あとできればDBのテーブル定義(CREATE TABLE文が良い)もご提示ください。 何かしらアドバイスするにも定義情報は必要ですし、今の状態だと「そのように組んでみては」としか言いようがない部分があります
miya71ma

2019/06/17 01:50

>>「1日1回」とのことですが、「前日のデータが存在しない」というケースはありますか? 株については詳しくはないですが、休みの日があってその日はデータが入ってこないとかはあるのでしょうか。 あり得ます。なのでデータがない場合は0を入れてエラーを回避したいと思っています >>テーブル定義(CREATE TABLE文が良い)もご提示ください。 かしこまりました。ご指摘ありがとうございます!
m.ts10806

2019/06/17 02:05

んーそれぞれのカラムがどういう役割なのかもできればコメント文であったほうが良いですね・・・。 日付に関するカラムは幾つかあるようですが「どの前日か」がこれでは分かりません。 汎用的な回答でよければしておきますが。
guest

回答2

0

ベストアンサー

timestamp型にしておき、date(current_timestamp - interval 1 day)とすることで「1日前」が実現できます。
ただ、current_timestamp自体は「現在の日時」になるのでここを「指定の日時」に置き換えてください。

そのうえで「データが取得できればそのデータを」「取得できなければ0を」の分岐を書いてください。

投稿2019/06/17 02:09

m.ts10806

総合スコア80850

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

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

miya71ma

2019/06/17 02:27

土日を挟む場合の処理もあるのでprepare('select * from insert_info where SC = ? ORDER BY date DESC LIMIT 0,1');としようとしていたのですが下策でしょうか? for($i = 0; $i < 25; $i++){ if($row[i] === '-'){ $st = $pd->prepare('select * from insert_info where SC = ? ORDER BY date DESC LIMIT 0,1'); $st->bindValue } }
m.ts10806

2019/06/17 03:07

えっとそのSCって必ず「前の情報である」ことを特定出来るものですか?
m.ts10806

2019/06/17 03:09 編集

一気にやってしまえるものならもちろんいいのですが、まずちゃんとロジック通すために1つ1つ組んでいったほうがいいかなと思ってのアドバイスでした。 まとめて行うようにするのはリファクタリングの領域とも言えます(つまり後からでもなんとでもなる)
miya71ma

2019/06/17 03:33

>>えっとそのSCって必ず「前の情報である」ことを特定出来るものですか? 別テーブルでのPKなのでできます
m.ts10806

2019/06/17 03:36

はいそれは良いのですが、CSV取り込み時に「前のSC」が分かるものなのでしょうか? こういった情報は確定してしまえば訂正がないはずなので、「未取り込みの最新データのみ」がやってくるのでは?
miya71ma

2019/06/17 03:57

一応このテーブルには6/17,6/16,6/15...の分のデータが入っており、SCは固定(6/15のSC=1は6/16もSC=1)です
m.ts10806

2019/06/17 04:23

それだとSCはPKにならないのでは? その値で検索して1件にならない時点でPKとは呼べません。 提示いただいたテーブル定義も完全なものではなく、PKの指定もないのでそのあたり判断できませんが
miya71ma

2019/06/17 06:23

SCがPKなのは別テーブルです。 一対多のリレーション付けをする予定でした
m.ts10806

2019/06/17 07:15

現在の質問内容でそこまでくみ取るのは不可能ですので、 質問内容に出せる情報はなるべく出してください。
miya71ma

2019/06/17 23:26

すみません。。。
m.ts10806

2019/06/17 23:27

いえ、追記してもらったらそれで良いですよ
miya71ma

2019/06/17 23:40

追記させていただきました
guest

0

まさに質問文に書いてある通り、「-」が入っていたら前日日付のデータを取得してinsert文を組むという処理を追加するだけですが

ロジックを組みたいのですが全くわかりません

の理由はきっとSQLのinsert文に関する理解が無いから
テーブルに対してのinsert文の組み立て方を知ればif文を組み込む場所も見えてくるはず

前日日付のデータを取得する事は既に出来ているという前提です。

投稿2019/06/17 01:56

hentaiman

総合スコア6421

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

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

miya71ma

2019/06/17 02:28

確かにご指摘の通りです。 少し進めて追加で質問してみたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問