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

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

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

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

PHP

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

Q&A

解決済

4回答

973閲覧

PHP CSVへ書き込み

hello_mate

総合スコア21

CSV

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

PHP

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

0グッド

0クリップ

投稿2019/08/26 10:02

もともと何行か書き込みのあるCSVに新たに1行追加したい時の記入方法で、
CSVには書き込みはされるものの、最後の行の後ろに追加されてしまう状態になっております。

csv

11,Mike,Mike@gmail.com,hello 22,John,John@gmail.com,hello 33,Peter,Peter@gmail.com,hello 44,Sam,Sam@gmail.com,hello

新たに5,Will,Will@gmail.com,helloを追加しようとすると

csv

11,Mike,Mike@gmail.com,hello 22,John,John@gmail.com,hello 33,Peter,Peter@gmail.com,hello 44,Sam,Sam@gmail.com,hello5,Will,Will@gmail.com,hello

となってしまいます。

この書き込みをしているコードは下記になります。

PHP

1<?php 2 session_start(); 3 $name = $_SESSION['name']; 4 $email = $_SESSION['email']; 5 $filename = 'Board.csv'; 6 7 if($_SERVER['REQUEST_METHOD'] === 'POST'){ 8 $comment = $_POST['comment']; 9 $last_id = $_POST['last_id']; 10 $new_id = $last_id + 1; 11 $data = array( array($new_id, $name, $email, $comment)); 12 if (($fp = fopen($filename, 'a')) !== FALSE) { 13 foreach($data as $value){ 14 $line = implode(',', $value); 15 fwrite($fp, $line); 16 } 17 fclose($fp); 18 } 19 } 20 header('Location: ./show.php');

show.phpでcsvの中身をphp上で表示させています。

どのように対処すれば1行ごと綺麗に書き込みができますでしょうか?
お手数おかけしますが、よろしくお願いいたします。

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

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

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

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

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

guest

回答4

0

CSVの読み書きなら、
PHP: SplFileObject::fgetcsv - Manual
PHP: SplFileObject::fputcsv - Manual
ほか、SplFileObjectを駆使すると便利です。
自分でセパレーター(デリミタ)を加工したりしなくても済むので。


元々のCSVの書き込み処理を見直して、
必ず1つの行の最後に改行コードをつけるようにするべきです。
テスト用かなにか、CSVをとりあえず作るコードで、
おそらくimplode()でPHP_EOLとか改行コードを挟み込んで
書き出しているのだろうと推察します。

そのために、一番最後の行の末尾にPHP_EOLなどの改行コードがついていないために、
新たなデータを追記すると
イメージ説明
この状態から
イメージ説明
この状態になってしまいます。

望ましいCSVの形式としては、
イメージ説明
こうなっている状態から
イメージ説明
こうなるべきで、
1行ごとに改行コードをつけていることを点検してみてください。

そういう面倒事を避けるために、ラクするならSplFileObjectが便利ではないかと。

投稿2019/08/26 10:41

編集2019/08/26 12:02
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

  • fgetcsvで配列として読み込んで
  • 配列に対して追加(更新)をして
  • fputcsvで書き込む

投稿2019/08/26 10:30

yambejp

総合スコア114814

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

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

0

ベストアンサー

試してないけど

php

1 $data = array( array($new_id, $name, $email, $comment)); 2 if (($fp = fopen($filename, 'a')) !== FALSE) { 3 foreach($data as $value){ 4 $line = implode(',', $value); 5 fwrite($fp, $line); 6 }

php

1 $data = array($new_id, $name, $email, $comment); 2 if (($fp = fopen($filename, 'a')) !== FALSE) { 3 $line = implode(',', $data); 4 fwrite($fp, "\n".$line);

とかで良いと思う。

投稿2019/08/26 10:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/08/26 10:15

ただ、csv としていろいろ問題あるはずなんで、ちゃんと csv フォーマットを理解して使用したほうが良いですよ。
guest

0

回答としたら、ファイルの最後が改行されてないのが原因だと思うのでfwrite($fp, PHP_EOL . $line);なのですが、ルールとしてデータ追加時には改行を入れるということにしてfwrite($fp, $line . PHP_EOL);でデータを追加していけばよいかと

投稿2019/08/26 10:13

rururu3

総合スコア5545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問