2010-05-14 5 views
0

5 초마다 로그를 생성하는 응용 프로그램이 있습니다. 로그는 아래 형식입니다. 내가 CSV 형식 아래에 이러한 변환하기 위해 노력하고Perl에서 지속적으로 업데이트되는 로그 파일을 읽으려면 어떻게해야합니까?

11:13:49.250,interface,0,RX,0 
11:13:49.250,interface,0,TX,0 
11:13:49.250,interface,1,close,0 
11:13:49.250,interface,4,error,593 
11:13:49.250,interface,4,idle,2994215 
and so on for other interfaces... 

:

Time,interface.RX,interface.TX,interface.close.... 
11:13:49,0,0,0,.... 

지금과 같은 단순하지만 문제는, 내가 곧 즉, 온라인 로그를 CSV 형식으로 데이터를 얻을 수 있습니다 파일을 업데이트하면 CSV도 업데이트해야합니다.

#!/usr/bin/perl -w 
use strict; 

use File::Tail; 
my $head=["Time"]; 
my $pos={}; 
my $last_pos=0; 
my $current_event=[]; 

my $events=[]; 

my $file = shift; 
$file = File::Tail->new($file); 

while(defined($_=$file->read)) { 
    next if $_ =~ some filters; 

    my ($time,$interface,$count,$eve,$value) = split /[,\n]/, $_; 
    my $key = $interface.".".$eve; 

    if (not defined $pos->{$eve_key}) { 
      $last_pos+=1; 
      $pos->{$eve_key}=$last_pos; 
      push @$head,$eve; 
     } 
     print join(",", @$head) . "\n"; 
} 

펄을 사용하여이 작업을 수행하는 방법이 있나요 : I 출력을 읽고 헤더가 만들려고 무슨

?

+2

코드에 어떤 문제가 있습니까? 읽기 루프 반복마다 추가 출력 파일을 열어야합니까? – runrig

+0

특정 문제가 무엇인가요? File :: Tail 또는 프로그램의 다른 부분으로 문제를 줄일 수 있습니까? –

답변

2

모듈 Text::CSV을 사용하면 CSV 형식 파일을 읽고 쓸 수 있습니다. Text::CSV은 내부적으로 Text::CSV_XS이 설치되어 있거나 내부적으로 Text::CSV_PP을 사용합니다 (이 설명을 개선하기 위해 Brad Gilbert 덕분에).

관련 행을 함께 그룹화하면 수행해야 할 작업입니다. 소스 날짜가 어디로 가는지 예제에서 분명하지 않습니다.

CSV 출력이 업데이트되었는지 확인하는 것은 기본적으로 출력 파일 줄을 버퍼링하도록하는 것입니다.


데이비드 M 아마도 문제의 연속 읽기 측면을 처리하기 위해 File::Tail 모듈 봐야한다 제안한다. 그러면 입력 로그 파일을 계속 읽을 수 있습니다.

그런 다음 Text :: CSV의 'parse'메서드를 사용하여 읽기 라인을 분할하고 'print'메서드를 사용하여 출력을 포맷 할 수 있습니다. 다양한 입력 라인의 정보를 결합하여 출력 라인을 만드는 방법은 나에게 수수께끼입니다. 당신이주는 예제에서 논리가 어떻게 작동하는지 알 수 없습니다. 그러나, 나는 당신이해야 할 일을 알고 있다고 가정하고,이 도구는 데이터를 처리하는 데 필요한 메커니즘을 제공합니다.

누구도 답을 숟가락으로 먹일 수 없습니다. 당신은 스스로 생각해야 할 것입니다. File :: Tail을 통해 계속 읽을 수있는 파일 핸들을 갖게됩니다. 당신은 데이터 라인을 읽기위한 CSV 구조를 가질 것입니다; 서면 출력을 위해 다른 CSV 구조가있을 것입니다. 당신은 당신이 쓸 때마다 지워지는 출력 파일 핸들을 가질 것이다. 이 점들을 연결하는 것이 이제 문제가되었습니다.

+0

고마워요 조나단하지만 내 문제는 어떻게 읽고 지속적으로 데이터를 로그 파일을 업데이 트하는 것입니다. 당신이 저에게 어떤 코드를 제안 해 주시겠습니까? – Space

+1

@Octopus : 문제는 CSV 구문 분석에 관한 것이 아니라 입력 변경에 따라 파일을 지속적으로 업데이트하는 것입니다. 그것은 그 질문에서 아주 분명하지 않았습니다. – Ether

+0

문제가 지속적으로 로그 파일을 읽는 경우 모든 CSV 관련 정보를 숨기지 않고 해당 질문을해야합니다. :) –

관련 문제