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

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

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

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Laravel 5

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

Q&A

解決済

1回答

6287閲覧

laravelでcsv出力

cofee

総合スコア44

CSV

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

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

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

Laravel 5

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

0グッド

1クリップ

投稿2018/01/15 01:05

編集2018/01/15 07:47

LaravelでSQL Serverから抽出した結果をCSV出力しようとしています。
ですがcsvをExcelで開いた際に日付のカラムが正しく表示されません。
なので、クエリを書く箇所で日付のカラムにシングルコーテーションを付けたしたいのですが
そのやり方がわかりませんでした。
よろしくお願い致します。

Laravel

1public function getCSV(){ 2 $fileName = "状況_". date('YmdHis'). ".csv"; 3 4 try { 5 6 $sql = DB::table('Tmail') 7 ->join('arrival','Tmail.key_no','=','arrival.key_no') 8 ->select('Tmail.key_no','work','send_dt')->get(); 9 10 11 // CSV形式でファイルを作成 12 // Linuxの場合/tmp/フォルダに作成する 13 $csvFileName = './downloadfiles/csv_list/'. $fileName; 14 $res = fopen($csvFileName, 'w'); 15 if ($res === FALSE) { 16 throw new Exception('ファイルの書き込みに失敗しました。'); 17 } 18 19 // CSVヘッダーの作成 20 $csvHeader = array("番号", "作業日", "送信日"); 21 22 // 機種依存文字が含まれるので SJIS-win を使用 23 mb_convert_variables('SJIS-win', 'UTF-8', $csvHeader); 24 fputcsv($res, $csvHeader); 25 26 27 // 配信情報を取得 28 $resultList = $sql; 29 30 while (count($resultList) > 0) { 31 foreach($resultList as $result) { 32 mb_convert_variables('SJIS-win', 'UTF-8', $result); 33 // stdClassから配列に変換 34 $resultArray = get_object_vars($result); 35 // ファイルに書き出しをする 36 fputcsv($res, $resultArray); 37 } 38 39 unset($resultList); 40 41 } 42 // ハンドル閉じる 43 fclose($res); 44 // ダウンロード 45 return Response::download($csvFileName, $fileName); 46 47 } catch(Exception $e) { 48 echo $e->getMessage(); 49 } 50 }

csv

1番号,作業日,送信日 21878806,"2017-01-25 16:24:14","2017-01-31 18:56:27.000" 31852883,"2017-01-25 16:25:43","2017-02-02 17:37:20.000" 4. 5. 6.

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

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

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

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

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

masaya_ohashi

2018/01/15 04:46

foreachでやっているfputcsvとwhile内でやっているfputcsvで、2回同じことを出力しているように見えます。消し忘れですか?また、while内で$resultListをunsetしたり、その直後に$sqlを入れたりしている処理の意図がわかりません。
cofee

2018/01/15 05:11

すいません。消し忘れでした。
masaya_ohashi

2018/01/15 05:14

whileの}がコメントアウトされていて、このコードでは動作しないように見えます。これで合っていますか?
cofee

2018/01/15 05:32

修正しました。これで大丈夫です。
masaya_ohashi

2018/01/15 06:07

ちなみにcsvで列の先頭にシングルクォーテーションを付けても、excelで開いたらシングルクォーテーションが付いた文字列としてシングルクォーテーションがそのまま画面に出てしまいますがそれでもいいのでしょうか?
cofee

2018/01/15 06:23

最悪、それでもいいのですが、Excelで開いてもシングルコーテーションが表示されない方法もあるのでしょうか?
masaya_ohashi

2018/01/15 06:29

シングルクォーテーションではなく、列をダブルクォーテーションで自力で囲めばExcelは「日付」として認識してくれます。ただし、2018-01-01のようなデータであっても、Excelで表示されるのは2018/1/1といったExcelの日付形式に勝手に変わってしまいます。また、ダブルクォーテーションを自分で付与するときは、「もともとダブルクォーテーションを含んでいるデータ」がある場合、エスケープ処理が必要になります。あなたの今回のデータは番号、作業日、送信日の3つのみなのでダブルクォーテーションのエスケープの心配はなさそうですが、自分でダブルクォーテーションを付ける処理で回答しても大丈夫でしょうか?
cofee

2018/01/15 06:35

とても勉強になります。ありがとうございます。ダブルクォーテーションを含んでいるデータは無いのでそちらの方法でご回答お願い致します。
guest

回答1

0

ベストアンサー

自分で出力するcsvのフォーマットを決めたいのであれば、fprintf等を使って、自力でcsvの行を作る必要があります。

PHP

1// 番号をid、作業日をwork_at、送信日をsend_atと仮定する 2// DBから取り出したdatetime型等をCarbonという便利なクラスに変換して、toDateTimeStringを使って欲しい文字列に変換する 3foreach($resultList as $result) { 4 mb_convert_variables('SJIS-win', 'UTF-8', $result); 5 $work_at = $result->work_at ? \Carbon\Carbon::parse($result->work_at)->toDateTimeString() : ""; 6 $send_at = $result->send_at ? \Carbon\Carbon::parse($result->send_at)->toDateTimeString() : ""; 7 fprintf($res, "%s,\"%s\",\"%s\"\n", $result->id, $work_at, $send_at); 8}

fprintf
http://php.net/manual/ja/function.fprintf.php

%s等の説明はsprintfのページを確認してください。
http://php.net/manual/ja/function.sprintf.php

Carbonについて
http://carbon.nesbot.com/docs/

投稿2018/01/15 06:43

編集2018/01/16 00:19
masaya_ohashi

総合スコア9206

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

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

cofee

2018/01/15 07:00

ありがとうございます! 実行したのですが、作業日の列は日付と時間が表示されていますが、送信日の列だけ日付が表示されず、時間のみ表示されました。 送信日の列も日付と時間を表示させたいのですがどうしたらよいのでしょうか?
masaya_ohashi

2018/01/15 07:04

出力したcsvが実際どんなテキストになっているか質問文に貼ってもらえますか?Excelで開くのではなく、テキストエディタで開いたものを貼り付けてください。
cofee

2018/01/15 07:29

エディタで開いたものを追加しました! ご確認お願いします。
masaya_ohashi

2018/01/15 07:43

おかしいですね、どうも"がちゃんと入っていないように見えます。これ、一度excelで開いて、excelで保存しちゃったファイルじゃないですか?
masaya_ohashi

2018/01/15 07:44

あと、fprintfは私の回答通りのフォーマットで使いましたか?そのコードの提示もお願いします。既存のコード部分を修正するのではなく、修正した部分だけを最下部に追記する形でお願いします。
cofee

2018/01/15 07:48

すいません。そのようでした。 ダウンロードし直したやつに変更しました!
masaya_ohashi

2018/01/15 07:57

あー、送信日のフォーマットがExcelで読み込めない小数点以下の秒数が含まれていますね。できればTmailモデルとDBのカラムの型の分かるもの(マイグレーションファイルが簡単)を質問文に追記してください。
cofee

2018/01/15 08:10

マイグレーションファイルは作成してませんでした。 send_dtの型はdatetimeでした!
masaya_ohashi

2018/01/15 08:18

あと、モデルは作成されていませんか?
cofee

2018/01/15 08:38

datetime2です! モデルも作成していません。
masaya_ohashi

2018/01/15 08:46

おそらくwork_atとsend_atはLaravelのデフォルト挙動としてCarbonに変換され$result内に格納されていると思うので、toDateTimeStringが使えるはずです。回答を修正したので参考にしてみてください。
cofee

2018/01/15 08:51

ありがとうございます。 Call to a member function toDateTimeString() on null のエラーが出てしまいました。
masaya_ohashi

2018/01/15 08:53

あー…work_atかsend_atがnullなレコードが存在するのですね…ちょっと修正します。
cofee

2018/01/15 08:56

お手数おかけします。ありがとうございます。
masaya_ohashi

2018/01/15 09:02

修正しましたがどうでしょうか?
cofee

2018/01/15 09:03

すいません。エラー内容は変わりませんでした。
masaya_ohashi

2018/01/15 09:27

打ち間違いがないかよく確認してみてください。work_atとあるべきところがsend_atになっていたり、逆になったりしていませんか?
cofee

2018/01/16 00:04

コピペしてやってみても Call to a member function toDateTimeString() on string と出てしまいました。
masaya_ohashi

2018/01/16 00:16

そのエラーはon nullからon stringに変わっているので別のエラーですね。 LaravelでのSQL Serverの扱いを知らないのですが、どうも型がCarbonに変換されていないようです。自力でCarbonのインスタンスに変換する処理でやってみましょう。
masaya_ohashi

2018/01/16 00:19

これならどうでしょうか?
cofee

2018/01/16 00:30

正常に表示されました!! ありがとうございます! 本当にとても勉強になりました。
cofee

2018/01/16 05:54 編集

もう一つお聞きしたいことがあるのですが、CSVを出力できたりできなかったりするのですが、どうしてでしょうか?できないときはHttpエラー500が表示されます。 データの量が多すぎるからでしょうか? また、何か解決策はありますでしょうか? よろしくお願いします。
masaya_ohashi

2018/01/16 09:24

さすがにそれだけでは情報がたりなさすぎます。エラー画面のスクリーンショットが取れれば、別の質問として立ててみるのもいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問