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

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

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

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

PHP

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

Q&A

解決済

1回答

6581閲覧

phpにてcsvファイルの特定行を修正する関数をつくりたい

singlestroke

総合スコア68

CSV

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

PHP

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

0グッド

0クリップ

投稿2016/12/15 14:16

下記のようなcsvファイルでデータを管理しています。

■やりたいこと
・phpで
・下記csvファイル内のseqを指定して
・まだ値がないカラムへのデータを格納する
・既にデータがある場合はデータを修正する
という関数を作りたい

■csvファイルの形式
seq,名前,データ1,データ2,登録日時,編集日時
1,太郎,ダミーデータAA,ダミーデータBB,2016/12/13 22:35:00,
2,次郎,ダミーデータAB,,2016/12/13 23:35:00,
※文字コードはSJIS

■流れとして
1.[編集画面]GETでseqを指定、seqから編集したい行を指定
→その行を「,」で分割、セッションに格納、編集画面のフォームに表示
2.[編集確認画面]上記で編集した内容をバリデーション、問題なければ入力内容を表示
3.[編集完了画面]【ここで編集完了するために実行する関数】

■コード

PHP

1function data_edit () { 2 3 // 書き込むファイル名 4 $filename = FILE_PATH; 5 6 // ローケルを設定 7 setlocale(LC_ALL, 'ja_JP.UTF-8'); 8 $filename = FILE_PATH; 9 // ファイルの内容を全て文字列に読み込む 10 $tempCSV = file_get_contents($filename); 11 $tempCSV = mb_convert_encoding($tempCSV, 'UTF-8', 'SJIS'); 12 $fp = tmpfile(); 13 fwrite($fp, $tempCSV); 14 // ファイルポインタの位置を先頭に戻す 15 rewind($fp); 16 17 // ファイル全体を読み込んで配列に格納する 18 $data_list = file($filename); 19 // 文字コードを変更 20 mb_convert_variables('UTF-8', 'SJIS', $data_list); 21 // 読み込みのみモード 22 $fp = fopen($filename, "r"); 23 24 25 // 編集行を格納する変数 26 $edit_data = ""; 27 28 foreach ($data_list as $line) { 29 // 各行をカンマ区切りで分割 30 list ($seq, $name, $data1, $data2, 31 $register_date, $editdate) = explode(",", $line); 32 33 // csvファイル内のseqとセッションで持っている修正seqが一致したら 34 if ($seq === $_SESSION["seq"]) { 35 // ファイルに書き込むデータを整形 36 $edit_data = $_SESSION["seq"] . "," 37 . $_SESSION["name"] . "," 38 . $_SESSION["data1"] . "," 39 . $_SESSION["data2"] . "," 40 . $register_date . ","// 登録日時は変わらないので既にcsvにあるデータを使用 41 . date("Y/m/d H:i:s") 42 . ",\n"; 43 $edit_data = mb_convert_encoding($edit_data, "SJIS", "UTF-8"); 44 45 } 46 47 } 48 fflush ($fp); 49 flock($fp, LOCK_UN); 50 fclose($fp); 51 52}

ここまでで編集するデータは$edit_dataに格納されていると思うのですが、これ以降どのようにしたらよいのか分かりません。

再度csvデータを書き込みモードで開き、データをseqで特定して置換ということになるのでしょうか。

データを読み込んだ際にseqを指定しているので、その流れで同時に上書きするような記述方法があればより完結に記述できるよう思うのですが、、

教えていただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

fgetcsv()で読み込んで、配列状態で修正後fputcsv()で上書きしてやればよいのでは?
ftrucate()やfseek()は適宜対応ください

投稿2016/12/15 14:30

yambejp

総合スコア114775

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問