my $file = $q->param('LOGFILE');

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"で落ちてしまいます。
何が間違っているのでしょうか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/09/06 11:29:20
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:tpichu No.2

回答回数304ベストアンサー獲得回数1

ポイント40pt

改定案ですが・・・


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/, $_);

}

ただ、これでは最後の一行しか記録できないですが、よろしいのですか?

id:Sugipon

全行を1行ずつ"@csv_data"に入れたいのです。

2006/09/06 09:36:34

その他の回答5件)

id:wakachang No.1

回答回数185ベストアンサー獲得回数8

多分perlだと思うのですが、perlのバージョンとOSとサーバーのバージョンを教えて下さい。

あとファイルのエンコードもお願いします。

id:tpichu No.2

回答回数304ベストアンサー獲得回数1ここでベストアンサー

ポイント40pt

改定案ですが・・・


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/, $_);

}

ただ、これでは最後の一行しか記録できないですが、よろしいのですか?

id:Sugipon

全行を1行ずつ"@csv_data"に入れたいのです。

2006/09/06 09:36:34
id:jiangmin-alt No.3

回答回数125ベストアンサー獲得回数8

ポイント50pt

まず、言語は何でしょうか。perlのように見えますが。

close(LOG)したあとwhile(<LOG>){}があるのでそもそもwhileループの中は実行されないんじゃありませんか。それに、sysread(LOG, $filestr, $file_size)の$file_sizeが未定義だから0なので、$filestrの中身は空でしょう。

id:Sugipon

すみません。

正しくは以下のようになります。

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);

2006/09/06 09:40:29
id:ootatmt No.4

回答回数1307ベストアンサー獲得回数65

何が間違っているというか、全然間違っていますよね。


下のデータはこんなデータなんですよね?

060904 日本太郎 10 4 男性

060904 日本花子 9 4 女性


これを@csv_datに入れるんですか?

二次元配列にするのか、ハッシュの配列にするのか、そのへんの設計をはっきりした方がいいと思います。

id:ootatmt No.5

回答回数1307ベストアンサー獲得回数65

ポイント20pt

このようにしてはどうですか。

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'};

id:b-wind No.6

回答回数3344ベストアンサー獲得回数440

結局何がしたいのか明確ではないんですが、$filestrってなんですか?$file_sizeも未定義のままだし、使わなくていいんじゃあ?

my @csvdata = ();

while(<LOG>){

chomp;

push @csv_data , [split /\t/];

}

こうじゃないんですか?

  • id:ootatmt
    結局データ構造が不明なままだけど、うまくいったのだろうか?
  • id:wakachang
    質問するときはOSが何かくらい教えてほしかったですね。
    Linuxやperlのverによっても対処法色々考えられますしね。
  • id:Sugipon
    ootatmtさん>皆さんのご指摘を参考に何とかうまく動きました。

    wakachangさん>情報足らずで申し訳ありませんでした。
    今後はもう少し情報を付加して質問するようにいたします。

    みなさん、ありがとうございました。
  • id:wakachang
    うまくいったのならば良かったですね(^^)
    気になったまま寝てしまったもので…。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません