CGI-BBS > 基礎 > その他 > コメント欄での入力にて改行するとファイルに書込まれない


カレッヂ
カレッヂ


データ復旧、即日 データ¨復旧¨テラステーション¨修理

質問者 極超初心者  投稿日 1/30(木) 15:06:04
毎度毎度で本当に申し訳ございませんが、またまた質問させていただきます。

CSVファイルへの書き出しをまだ作成中なのですが、今回コメント欄をつけることとなり、そのテキストもCSVに書き込むことになりました。
htmlファイルにて、

<tr><td><nobr>&nbsp;コメント:</nobr></TD>
<textarea rows="3" name="a3" cols="60" wrap="off"></textarea></TD></TR>

と記述したコメント欄に入力する場合、通常のテキスト入力ではどんなに長くてもCSVファイルに書き込まれますが、途中で改行を入れると改行前の最初の部分しかファイルに書き込まれません。
(”本日は<改行>晴天<改行>なり。”と入力した場合、”本日は”のみがファイルに書き込まれています。)
改行が入っていても、文章全てがCSVファイルに登録されるようにしたいのですが、どのようにすれば宜しいでしょうか?

プログラムは、
#!/usr/local/bin/perl

# POSTメソッドかGETメソッドかによる処理
if( $ENV{'REQUEST_METHOD'} eq "POST" ) {
read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} );
} else { $buffer = $ENV{'QUERY_STRING'}; }

@buf = split( /&/, $buffer );

# HTMLから渡された文字を処理して変数に代入する
foreach $data ( @buf ){
( $num, $val ) = split( /=/, $data );
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex( $1 ))/eg;
$personal{$num} = $val; }

if ($personal{'c1'} ne OK){

#データの確認
print "Content-type: text/html\n\n";
print "<html><head><title>データの確認</title></head>\n";
print "<body>\n";
print "<DIV align=center><table width=500 border=0 bgcolor=#FFFF33 align=center>\n";
print "<form method=get>\n";
print "<TR height=30><TD width=450>名  前:<b><font color=#0000FF>$personal{'a1'}</font></b><input type=hidden name=a1 value=$personal{'a1'}></td></tr>\n";
print "<TR height=30><TD width=450>性  別:<b><font color=#0000FF>$personal{'a2'}</font></b><input type=hidden name=a2 value=$personal{'a2'}></td></tr>\n";
print "<TR height=30><TD width=450>コメント:<b><font color=#0000FF>$personal{'a3'}</font></b><input type=hidden name=a3 value=$personal{'a3'}></td></tr>\n";
print "<tr><td colspan=2><br></td></tr>\n";
print "<tr height=30><td colspan=2>よろしければ”OK”を押してください。<br>データの修正を行いたい場合、ブラウザの”戻る”で前画面に戻って修正を行ってください。</td></tr>\n";
print "<center><input type=hidden name=c1 value=OK><input type=submit value=OK></center></td></tr>\n";
print "</form>\n";
print "</table></div>\n";
print "</body></html>\n";
exit;
} else {
to_csv();
}

#CSVファイルに出力する
sub to_csv {
$file = "data.csv";
open (FILE, ">> $file");
print FILE "$personal{'a1'},$personal{'a2'},$personal{'a3'}\n";
close (FILE);
}

大変申し訳ございませんが、アドバイスいただけないでしょうか?
宜しくお願い致します。

プロバイダ参照:
サーバのOS:UNIXサーバ
パソコンのOS:WinNT系
エディタ:TeraTerm
FTPソフト:FFFTP
サーバ移転:していない
改造:していない
CGI習熟度:firsttime

回答者 しあわせのツボ  [削除]  投稿日 1/30(木) 18:30:33
CSVは1行1データが大前提です。従って改行を直接記録することはできません。
別の何らかの形(たとえば<br>)に変換して記録することになります。
質問者 極超初心者  [削除]  投稿日 1/31(金) 10:16:38
しあわせのツボさん、毎度毎度ありがとうござます。
おっしゃる通りCSVでは改行をそのまま書き込むことはできませんね。
アドバイス通り、改行をとったら1行で書き込めました。

結果として、”#データの確認”の前に、

$personal{'a3'} =~ s/\r\n//g;
$personal{'a3'} =~ s/\r|\n//g;

を入れました。

誠にありがとうございました。

このページは終了したので返信(回答)は書きこめません
 


データ復旧、即日 データ¨復旧¨テラステーション¨修理 Web裏技