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

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

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

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

MySQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

2480閲覧

csvファイルで空になっているところも選択してインサートしたい

lkjgffh

総合スコア37

CSV

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

MySQL

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

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2018/02/01 08:48

編集2018/02/01 08:51

下記のようなcsvデータをデータベースに登録するアプリを作っています

バージョン情報 1,お客様氏名,2,生年月日,郵便番号,住所-1-1,電話番号,,,0 5,契約日 11,契約店舗,都道府県番号,店舗種類コード,2751352,郵便番号,住所,電話番号 201,ID,製品名,製品コード,製品の種類 301,商品説明,商品素材,原産国 301,商品説明,,原産国

今扱っているcsvは先頭の番号によって保存するテーブルが異なります

301,商品説明,商品素材,原産国 301,商品説明,,原産国

このように複数送られてきて、かつ、入力必須項目で無い部分が抜けているデータがあります。
私が書いているコードではこの抜けているデータがある場合指定できませんというエラーが出てしまいます

public function post(Request $request){ $user_id = $request->user_id; //csvデータを多次元配列化 $csvData = $request->getContent(); $lines = explode("\n", $csvData); $array = array(); foreach ($lines as $line) { $array[] = str_getcsv($line); } $setumei= array_filter($array, function($record){ return $record[0] == 301; }); if(empty($setumei) != true){ $setumei_count = count($setumei); $setumei= array_merge($setumei); for($i = 0; $i < $setumei_count; $i++){ $setumei_in[] = [ 'setumei' => $setumei[1], 'sozai' => $setumei[2], 'gensankoku' => $setumei[3], 'user_id' => $user_id ]; } var_dump($setumei); // $setumei= DB::table('setumei')->insert($setumei_in); } }

ダンプをすると空欄のところはこのように出力されます
[2]=> string(0) ""

どのようにすれば上記のように空欄のある配列が混ざっていてもインサート文を組み立てることができますでしょうか?

レコードが複数送られてこないなら、入力必須で無い要素が空か否かでインサート文を分けられるのですが、上記のようにあるもの無いものが混在する場合どう対処していいものか分からないのでアドバイスいただければと思います

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

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

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

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

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

guest

回答2

0

なんとなく見た感じinsertの問題よりは、プログラム自体に変な不具合が多発している状態のような気がします。

基本的にはエラーメッセージはコピペで報告してもらった方が解決が早くなるのでもしあれば次回からは貼って頂いた方が良いと思います。

それはさておき変なところを一通り上げてみますと、まず多分$setumeiに何が入っているのか、自分でも分かっていないために色々おかしくなっていると思います。複数のリストであれば$setumeis、単一のデータであれば$setumeiのようにして、わかりやすくしておいた方が良いと思います。(ちゃんとした英単語にした方が良いと思います)

結局、下記のプログラムが正しいのではないでしょうか。

php

1$setumeis = array_filter($array, function($record){ 2 return $record[0] == 301; 3}); 4foreach ($setumeis as $setumei) { 5 $setumei_in[] = [ 6 'setumei' => $setumei[1], 7 'sozai' => $setumei[2], 8 'gensankoku' => $setumei[3], 9 'user_id' => $user_id 10 ]; 11 $setumeiEntity = DB::table('setumei')->insert($setumei_in); 12}

修正した問題は

  • 変数がわかりにくいため場所によって変なことをしている。
  • array_mergeの目的が不明。多分不要。
  • insertがループの外にあるので最後の1回しか保存されない。

分からなくなったらLaravelだとdd関数で調べられますので、色々な場所で見てみて下さい。

投稿2018/02/01 09:22

dala00

総合スコア441

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

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

0

ベストアンサー

setumeiの参照方法がおかしいですね

array_filterから戻り値を得ている$setumeiは配列なのでこうしてください

PHP

1if(count($setumei)>0){ 2 foreach($setumei as $row){ 3 $setumei_in[] = [ 4 'setumei' => $row[1], 5 'sozai' => $row[2], 6 'gensankoku' => $row[3], 7 'user_id' => $user_id 8 ]; 9 } 10} 11var_dump($setumei_in);

投稿2018/02/01 09:14

yambejp

総合スコア114839

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

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

yambejp

2018/02/01 09:17

PHPの配列はフィルタしても前につめません。 したがってforで回そうにも0から始まるわけではないのです。 foreachで回すのがPHPの基本です。
yambejp

2018/02/01 09:17 編集

ダブった
lkjgffh

2018/02/01 09:20

大変勉強になりました。アドバイス本当にありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問