アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
csvファイルで作成したデータを出力表示させるスクリプトで
csvファイル内の改行コード(セル内)以後のデータが出力できません。
下記の置換で改行コード以後のデータが表示されません。

$abc =~ s/\r\n//g;
$abc =~ s/\n//g;
$abc =~ s/\r//g;

csvファイル内の改行の数が多く、1行のデータが改行の為に、2行になったりしているので出力前に置換し表示させる方法です。
csvファイル作成時につく""は正常に置換しています。

似たような質問もあったのですが、少し違うようですので質問いたしました。
何卒、ご教授お願いいたします。

A 回答 (2件)

状況が良く分からないのですが、



ファイルから一行ずつ読み込み(データ中に改行があるので1レコード分とは限らない)
改行文字を置換で削除
行末に\nを付けて出力

のような処理になっているのではないでしょうか。
これでは結局、データ中の改行は消えませんよね。
置換はその書き方で動作すると思うので、
入力、出力の仕方をどうやっているか、も書かれた方が良いと思います。

とりあえず、参考までに、
「1レコード」ずつ読み込む方法の例だけ書いておきます。

例えば、行末が"\r\n",データ中では"\n"の場合なら、
  $/="\x0D\x0A";
で読み込めば、一レコードずつ取り出せます。

例えば、行末が"\n",データ中の改行も"\n"で、
データ中に改行がある時は"~"が付加され、データ中に"がある時は""に置き換えられている
という条件であれば、
  $/="";
  $all=<>;
  @lines=($all=~/\G((?:".*?"|[^"])*?)\n/gs);
$lines[0]が1レコード目、$lines[2]が2レコード目・・となります。

この回答への補足

データ読込み↓
sub CSV_DL
{
open(CSV, "<$csv") or &printErrorPage("取得失敗");
eval{ flock(CSV, 1) };
@DATA = <CSV>;
close CSV;

$douitu = 0;
$name = 0;
$name2 = 0;
while ($name < @DATA)
{
(@AAA) = split(/\,/, @DATA[$name]);
if ("@no[0]" eq "@AAA[0]")
{
$name2 = "$name";
}
if ("@new_no[0]" eq "@AAA[0]")
{
$douitu=1;
}
$name++;
}
}

データ出力↓

($no,$name,$syousai,$end) = split(/\,/, @DATA[$name2]);

$syousai =~ s/\*/\*/g;
$syousai =~ s/\r\n//g;
$syousai =~ s/\n//g;
$syousai =~ s/\r//g;
$syousai =~ s/\"</\</g;
$syousai =~ s/\>\"/\>/g;
$syousai =~ s/\""/\"/g;
$syousai =~ s/\""""/\""/g;

$syousaiにはhtmlタグが入っています。
上記の場合は下記はどこへ記述すればよろしいでしょうか?

>例えば、行末が"\r\n",データ中では"\n"の場合なら、
>$/="\x0D\x0A";
>で読み込めば、一レコードずつ取り出せます。
ご教授お願いいたします。

補足日時:2007/01/24 12:53
    • good
    • 0

あ、一気に配列に読んでいるのですね。


でも同じ対処で行けると思います。

$/="\x0D\x0A"("\r\n"でも良いです)は、
> @DATA = <CSV>;
この行より前までに入れておけば良いです。
また、@DATA=<CSV>より後に
$/をデフォルトの値に戻すという意味で、
$/="\n"を入れておいた方が良いでしょう。
(本当はこういう時はlocalを使うものなのかも知れませんが)
    • good
    • 0
この回答へのお礼

ご回答いただき誠にありがとうございます。
正常に取り込みできました。
感謝いたします。

お礼日時:2007/01/24 16:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!