人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: Sugipon
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:open オープン ファイル ループ ログファイル
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● wakachang
●0ポイント

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

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


2 ● tpichu
●40ポイント ベストアンサー

改定案ですが・・・


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"に入れたいのです。


3 ● jiangmin
●50ポイント

まず、言語は何でしょうか。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);


4 ● ootatmt
●0ポイント

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


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

060904 日本太郎 10 4 男性

060904 日本花子 9 4 女性


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

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


5 ● ootatmt
●20ポイント

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

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


1-5件表示/6件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ