こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Perl 先頭行に追加

恐れ入ります。
Perlで、配列がカンマで区切られたデータを読み込み、
その先頭行にデータを挿入したいのですが、
中々うまくいきません。

データ(/data/xxx.txt)の中身は、
test,test2
bbb,bbb2
ccc,ccc2
という感じで、カンマで区切られて改行で並んでいます。
そこに新たに$dateと$contで受けたデータを先頭行に追加する感じです。

open(FILE,"<./data/xxx.txt");
while($temp = <FILE>){
@temp=split(/,/,$temp);
push(@ddr,"$temp[0]","$temp[1]");
}

seek(@ddr,0,0);
unshift(@ddr,($date,$cont."\n"));

open(FILE,">./data/xxx.txt");
$new=join(",",@ddr);
print FILE $new;
close(FILE);


このように書いていますが、
print FILE @ddr とすると、配列が壊れた状態(全て繋がる)で先頭行には挿入されたのですが、カンマで区切って配列にして並べようとしたら、

test,test2
,bbb,bbb2,
,,ccc,ccc2,,

という感じで上手く並びません。

よろしくおねがいします。

投稿日時 - 2018-11-08 13:37:20

QNo.9555772

すぐに回答ほしいです

質問者が選んだベストアンサー

ファイルを配列に読み込み
配列にunshiftで値をのっけて
そのまま配列をファイルに書き込む

open FILE,'./data/xxx.txt';
@ddr = <FILE>;
close FILE;

unshift @ddr,"$date,$cont\n";

open FILE,'>./data/xxx.txt';
print FILE @ddr;
close FILE;


なにかいろいろ処理するなら

open FILE,'./data/xxx.txt';
while($temp = <FILE>){
chomp $temp;
@temp=split(/,/,$temp);

なにか処理

###push(@ddr,"$temp[0]","$temp[1]");
これだと$temp[0]と$temp[1]が順番に代入される
見づらいけどコンマとまとめて代入するなら""で囲む

push @ddr,"$temp[0],$temp[1]\n";
}
close FILE;

###seek(@ddr,0,0);
unshift @ddr,"$date,$cont\n";

open FILE,'>./data/xxx.txt';
###$new=join(",",@ddr);
###print FILE $new;
print FILE @ddr;
close FILE;

投稿日時 - 2018-11-08 23:01:39

お礼

ありがとうございます。目的としていた結果が得られました。
""で纏めて代入すれば良いんですね!
大変助かりました。

投稿日時 - 2018-11-09 07:41:19

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

open FILE,'./data/xxx.txt';
これ全角が入ってたんで↓に訂正
open FILE,'./data/xxx.txt';

投稿日時 - 2018-11-08 23:27:31

お礼

修正ありがとうございます。

投稿日時 - 2018-11-09 07:39:23

ANo.1

txtとか、csvなど、基本的にパソコンのファイルは順編成ファイルと呼ばれるもので、先頭への追加とか、途中レコードの変更というのはできません。この仲間として、カセットテープとかも同じ部類です。もしやりたいのであれば、メモリ上追加したイメージで作成し、それをファイル(上書き)へ書き直すことになります。

投稿日時 - 2018-11-08 15:57:33

お礼

そうでしたか。。以前出来た記憶だったので、すこしチャレンジしてみます。

投稿日時 - 2018-11-09 07:40:20

あなたにオススメの質問