open(LOG, "$CONF{'LOG_DIR'}/$file") || &ErrorPrint("ログファイル <tt>$file</tt> をオープンできませんでした。 : $!");
my $filestr;
sysread(LOG, $filestr, $file_size);
close(LOG);
# ループ処理で全ての行にわたって処理
while(<LOG>){
# 行末に改行文字があれば削除
chomp;
my @csv_data = split(/\t/, $filestr);
}
上記のように読み込んだファイルを
1行ずつ読み込んでタブで区切られた値を@csv_dataに代入したいのですが、
「my @csv_data = split(/\t/, $filestr);」の"$filestr"で落ちてしまいます。
何が間違っているのでしょうか?
改定案ですが・・・
my $file = $q->param('LOGFILE');
open(LOG, "$CONF{'LOG_DIR'}/$file") || &ErrorPrint("ログファイル $file をオープンできませんでした。 : $!");
my $filestr;
sysread(LOG, $filestr, $file_size);
close(LOG);
# ループ処理で全ての行にわたって処理
while($filestr){
# 行末に改行文字があれば削除
chomp;
my @csv_data = split(/\t/, $_);
}
ただ、これでは最後の一行しか記録できないですが、よろしいのですか?
改定案ですが・・・
my $file = $q->param('LOGFILE');
open(LOG, "$CONF{'LOG_DIR'}/$file") || &ErrorPrint("ログファイル $file をオープンできませんでした。 : $!");
my $filestr;
sysread(LOG, $filestr, $file_size);
close(LOG);
# ループ処理で全ての行にわたって処理
while($filestr){
# 行末に改行文字があれば削除
chomp;
my @csv_data = split(/\t/, $_);
}
ただ、これでは最後の一行しか記録できないですが、よろしいのですか?
全行を1行ずつ"@csv_data"に入れたいのです。
まず、言語は何でしょうか。perlのように見えますが。
close(LOG)したあとwhile(<LOG>){}があるのでそもそもwhileループの中は実行されないんじゃありませんか。それに、sysread(LOG, $filestr, $file_size)の$file_sizeが未定義だから0なので、$filestrの中身は空でしょう。
すみません。
正しくは以下のようになります。
my $file_size = -s "$CONF{'LOG_DIR'}/$file";
open(LOG, "$CONF{'LOG_DIR'}/$file") || &ErrorPrint("ログファイル $file をオープンできませんでした。 : $!");
my $filestr;
while(<LOG>){
chomp;
# 1行のデータをタブで区切られた項目ごとに変数に格納
# $data[0] に0カラム目
# $data[1] に1カラム目
# というように格納される
my @csv_data = split(/\t/, $filestr);
}
sysread(LOG, $filestr, $file_size);
close(LOG);
何が間違っているというか、全然間違っていますよね。
下のデータはこんなデータなんですよね?
060904 日本太郎 10 4 男性
060904 日本花子 9 4 女性
これを@csv_datに入れるんですか?
二次元配列にするのか、ハッシュの配列にするのか、そのへんの設計をはっきりした方がいいと思います。
このようにしてはどうですか。
open(LOG, "$CONF{'LOG_DIR'}/$file") || &ErrorPrint("ログファイル $file をオープンできませんでした。 : $!");
my $i;
my %csv_data;
while (<LOG>) {
chomp;
my ($date, $name, $month, $day, $sex) = split /\t/, $_;
$csv_data[$i] = {
'date' => $date,
'name' => $name,
'month' => $month,
'day' => $day,
'sex' => $sex
};
$i++;
}
close (LOG);
以下のようにしてそれぞれの要素を読み出すことが出来ます。
print $csv_data[0]{'sex'};
print $csv_data[1]{'name'};
結局何がしたいのか明確ではないんですが、$filestrってなんですか?$file_sizeも未定義のままだし、使わなくていいんじゃあ?
my @csvdata = ();
while(<LOG>){
chomp;
push @csv_data , [split /\t/];
}
こうじゃないんですか?
全行を1行ずつ"@csv_data"に入れたいのです。