スレッド表示 | フラット表示〕 全トピック 920 件中 228 番目 次≫ ≪前

csvファイルの更新でなぜ空行が追加?

created: 2006-06-25 08:46 | modified: 2006-06-28 18:18 | reply: 7

[3120] csvファイルの更新でなぜ空行が追加?

user: じゃが | created: 2006-06-25 08:46
お世話になっております。

データを登録、一覧表示まででき、一覧の中から
やっと見たいデータの詳細表示が出せるようになったのですが、データの編集
をし登録したら、変更はできているのですが
一覧に戻ると空白行が追加されてしまいます。どなたか、どこが悪くて1行追
加されてるか、ご指摘下さい。お願いします

<?php

if ($_POST[save]!=""){
//--- 現在の情報を配列に格納
$fp = @fopen("toti.csv","r") or die("File not readopen is toti.csv")
;
$i=0;
$buff = "";
while(!feof($fp)){
$buff[$i] = fgets($fp);
$i++;
}
fclose($fp);

$gyosu = $i;

//--- データ生成
$no = $_POST[save];
$pm[0] = $_POST[id];
$pm[1] = $_POST[add];
$pm[2] = $_POST[area];
$pm[3] = $_POST[area_price];
$pm[4] = $_POST[price];
$pm[5] = $_POST[used];
$pm[6] = $_POST[kenpei];
$pm[7] = $_POST[youseki];
$pm[8] = $_POST[condition];
$pm[9] = $_POST[comment];
$buff[$no] = implode(",",$pm)."\n";

//--- データを保存する
$fp = @fopen("toti.csv","w") or die("File not writeopen is toti.csv"
);
for($i=0;$i<$gyosu;$i++){
fputs($fp,$buff[$i]);
}
fclose($fp);
header("Location:listcsv.php");
exit;
}


//--- パラメータ取得
$no = (int) $_GET[no];

//--- toti読み込み
$i=0;
$fp = fopen("toti.csv","r") or die("File not open is toti.csv");
while(!feof($fp)){
$buff = fgets($fp);
if ($i==$no) {
$arBuff = explode(",",$buff);
$toti[id] = $arBuff[0];
$toti[add] = $arBuff[1];
$toti[area] = $arBuff[2];
$toti[area_price] = $arBuff[3];
$toti[price] = $arBuff[4];
$toti[used] = $arBuff[5];
$toti[kenpei] = $arBuff[6];
$toti[youseki] = $arBuff[7];
$toti[condition] = $arBuff[8];
$toti[comment] = $arBuff[9];
}
$i++;
}
fclose($fp);
?>
<!DOCTYPE HTML PUBLIC "-//W3C//Dtd HTML 4.0 transitional//EN">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">

</head>
<body>
<form method="POST" name="main" enctype="multipart/form-data">
<?php

echo <<<EOT
<b>土地情報編集画面</b><br>
<table border="1">
<tr>
<td>番 号</td>
<td><input size="20" type="text" name="id" value="{$toti[id]}"><
/td>
</tr>
<tr>
<td>所在地</td>
<td><input size="40" type="text" name="add" value="{$toti[add]}"
></td>
</tr>
<tr>
<td>面積(坪)</td>
<td><input size="20" type="text" name="area" value="{$toti[area]
}"></td>
</tr>
<tr>
<td>坪単価</td>
<td><input size="20" type="text" name="area_price" value="{$toti
[area_price]}"></td>
</tr>
<tr>
<td>総価格</td>
<td><input size="20" type="text" name="price" value="{$toti[pric
e]}"></td>
</tr>
<tr>
<td>用途地域</td>
<td><input size="40" type="text" name="used" value="{$toti[used]
}"></td>
</tr>
<tr>
<td>建ぺい率</td>
<td><input size="20" type="text" name="kenpei" value="{$toti[ken
pei]}"></td>
</tr>
<tr>
<td>容積率</td>
<td><input size="20" type="text" name="youseki" value="{$toti[yo
useki]}"></td>
</tr>
<tr>
<td>現 状</td>
<td><input size="40" type="text" name="condition" value="{$toti[
condition]}"></td>
</tr>
<tr>
<td>備 考</td>
<td><textarea rows="4" cols="40" name="comment">{$toti[comment]}
</textarea></td>
</tr>
</table>
<p>
<input type="hidden" name="save" value="{$no}">
<input type="submit" value="登録する">
<input type="button" value="キャンセル" onclick="location.href='listcs
v.php'">
EOT;
?>
</form>
</body>
</html>
reply: 3121 返信 編集 削除

[3121] RE:

user: Pluto | created: 2006-06-26 11:15
while(!feof($fp)){
$buff[$i] = fgets($fp);

 不自然な空白を含む出力は、この部分の処理で空白要素が$buffに組み込まれているために起こります。
 空白要素の組込みを阻止するには、
 例えばですが、

while(!feof($fp)) {
$dat = fgets($fp);
if(trim($dat)) $buff[$i] = $dat;

 組み込む要素が空白であれば、配列に組み込まないようにしてみてはどうでしょう?
Parent: 3120  reply: 3125 返信 編集 削除

[3125] 何とかなりました。

user: じゃが | created: 2006-06-26 23:20
どうやら、受け取ったデータをまとめるさいに

$buff[$no] = implode(",",$pm)."\n";

この文の最後に."\n"の改行をしている命令が
良くなかったようです。

Pluto様 貴重なお時間ありがとうございます。
まだまだ、わからないことばかり。

また、お願いします。
Parent: 3121  reply: 3126 返信 編集 削除

[3126] 何とかなっていませんでした

user: じゃが | created: 2006-06-27 22:18
これだと、csvファイルの最終行の最後にだけ
改行がされず。次に新規登録したら大変なことに
なりました。

ファイルを読み込んで最終行の最後にだけ\nを
入れるにはどうすればよいでしょうか?
Parent: 3125  reply: 3127 3128 返信 編集 削除

[3127] RE:

user: Pluto | created: 2006-06-28 00:22
 複数回の更新を前提としたCSVファイルなら、要素末の改行は省いてはいけません。
 要素を抜き出し編集用配列に納める際に、区切りは必要ですから。

 じゃがさんは、whileと!feofのループからfgetsで要素を抜き出していますが、forとfileを使ってみてはどうでしょう?
 自分は普段CSVを処理する際、この方法を執っています。

 一例ですが、

// toti.csvの要素を一行づつ、配列$buffに収納
$buff = file("toti.csv");

$buff[$no] = implode(",",$pm)."\n";
// 単に配列の最後尾に値を追加するのが目的であれば
// array_push()も使えます
array_push($buff, implode(",", $pm) . "\n");

// 書き込み
for($i=0;$i < sizeof($buff);$i++) {
fputs($fp, $buff[$i]);
}

 重複する箇所は省略しています。
Parent: 3126  reply: 3129 返信 編集 削除

[3129] 基本的につくりが悪いのでしょうか?

user: じゃが | created: 2006-06-28 16:04
すみません。
よくわかりません。

あれやこれややるうちに、わけわからなくなりました。

先に空行ができたり???
Parent: 3127  返信 編集 削除

[3128] Re: 何とかなっていませんでした

user: ach | created: 2006-06-28 02:34
$csv = 'toti.csv';

//CSVの読み込み。
//array_mapで行末の改行コードを取り除く。
//array_filterで空白行を削除
$buff = array_filter(array_map('trim',file($csv)));

//CSVを更新(編集時)
$buff[$no] = implode(",",$pm);
file_put_contents($csv,implode("\n",$buff)); //ここで改行コードをつける

/*
//CSVを更新(新規登録時)
array_push($buff,$newData);
file_put_contents($csv,implode("\n",$buff)); //ここで改行コードをつける
//もしくは先頭に改行コードを入れて追加(お勧めしません)
file_put_contents($csv,'a',"\n".$newData,FILE_APPEND);
*/

要は最初に全改行コードを削除して、最後に全改行コードを追加するということ。
こんな風に編集時は改行を意識しなくてよいようにコードを書くという手もあります。
Parent: 3126  reply: 3130 返信 編集 削除

[3130] できたようです

user: じゃが | created: 2006-06-28 18:18
今度こそできたのかな?


ach さんのいう通りに
データ登録ページの登録前に強制的に¥nを
付けてみました。

何とか形になった様子です。

また、何かエラーが出なければいいのですが・・・

出たときはおねがいします。

あと、データの削除が残っています。
チェックボックスにチェック入れたら消えるやつです。
いくつかやり方があるようですが、
一番簡単なのはなんでしょうかね?
Parent: 3128  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 228 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑