2010-07-21 2 views
1

파일을 구문 분석하여 테이블에 저장해야합니다. 이것을 구현하기 위해 해시를 사용하라는 요청을 받았습니다. Perl에서만 그렇게 할 수있는 간단한 방법을 알려주세요.이 파일을 구문 분석하고이를 테이블에 저장하려면 어떻게해야합니까?

----------------------------------------------------------------------- 
L1234| Archana20 | 2010-02-12 17:41:01 -0700 (Mon, 19 Apr 2010) | 1 line 
PD:21534/lserve<->Progress good 
------------------------------------------------------------------------ 
L1235 | Archana20 | 2010-04-12 12:54:41 -0700 (Fri, 16 Apr 2010) | 1 line 
PD:21534/Module<->Dir,requires completion 
------------------------------------------------------------------------ 
L1236 | Archana20 | 2010-02-12 17:39:43 -0700 (Wed, 14 Apr 2010) | 1 line 
PD:21534/General Page problem fixed 
------------------------------------------------------------------------ 
L1237 | Archana20 | 2010-03-13 07:29:53 -0700 (Tue, 13 Apr 2010) | 1 line 
gTr:SLC-163/immediate fix required 
------------------------------------------------------------------------ 
L1238 | Archana20 | 2010-02-12 13:00:44 -0700 (Mon, 12 Apr 2010) | 1 line 
PD:21534/Loc Information Page 
------------------------------------------------------------------------ 

나는이 파일을 읽을 수와 나는 테이블에 다음 필드를 추출 분할 또는 무엇이든을 수행 할 :

  • L로 시작하는 ID가있는 첫 번째 필드해야한다 표
  • Archana20
  • 소인
  • PD는 제 인터넷에 있어야 번째 필드에 있어야 번째 필드에 있어야

    1. 방법이 파일의 --------… (구분선)을 무시 : ELD
    2. 유형

내 질문은 (/ 이전 내용은 마지막 필드에 있어야합니다)?

  • 위의 발췌 방법?
  • 파일에 두 개의 구분 기호 (|, /)가 있기 때문에 분할하는 방법은 무엇입니까?
  • 해시를 사용하여 구현하는 방법과 이에 대한 필요성은 무엇입니까?
  • 내가 초보자 인 Perl을 이해할 수 있도록 간단한 방법을 제공해주십시오.

    +1

    샌다 야는, 스택 오버플로에 오신 것을 환영합니다. 질문 서식을 편집 했으므로 원하지 않으면 실행 취소 할 수 있습니다. 앞으로이 사이트에서 질문 및 답변 형식을 올바르게 지정하는 방법을 알아 보려면 [편집 도움말] (http://stackoverflow.com/editing-help)을 읽어보십시오. – daxim

    +3

    이것은 숙제 문제가 아니기 때문에 비교적 복잡한 것 같습니다. 이미 코드를 찔러야합니다. 몇 가지 코드를 게시하여 일부 시도를 보여줍니다. – xenoterracide

    +0

    이것은 숙제가 아닙니다 ... 이것은 펄에서 저를 평가할 시작을 의미합니다 .... :( – Sandhya

    답변

    1

    당신이 This is not a homework...to mean this will be a start to assess me in perl라고 말하면 아마도 이것이 새로운 직업이나 다른 일에 처음으로 할당 한 것임을 의미한다고 가정합니다. 우리가 단지 당신에게 대답을 주면 나중에 실제로 당신을 해칠 것입니다. Perl에 대해 더 많이 알고 있다고 가정하십시오.

    그러나 올바른 방향으로 알려 드리겠습니다.

    A. split을 사용하지 마십시오. 정규 표현식을 사용하십시오. "perl regex" B. Google "perl hash"를 검색하여 perl 해시에 대해 알아보십시오. 첫 번째 결과는 매우 좋습니다. 질문에 이제

    :

    1. 정규 표현식은 추출 항목
    2. 정규 표현식을하지 않으려는 당신이 라인을 무시 도움이 될 것입니다. "변수를 잡아라"
    3. 분할하지 말고 정규 표현식을 사용하십시오
    4. 위의 B 점을 참조하십시오.
    +2

    존경심을 표합니다.하지만 정규 표현식이 '|'를 먼저 나눈 다음 나중에 /를 사용하여 최종 필드를 다시 분할하는 것보다 정규 표현식이 훨씬 어렵고 오류가 발생하기 쉽다고 생각하십시오. – Telemachus

    2

    내 질문은 :

    1. 방법이 파일의 -------- (구분선) 무시?
    2. 위의 발췌 방법?
    3. 파일에 두 개의 구분 기호 (|, /)가 있으므로 분할하는 방법은 무엇입니까?
    4. 해시를 사용하여 구현하는 방법과 이에 대한 필요성은 무엇입니까?
    1. 것은 당신은 아마 루프 라인하여 파일 라인을 통해 작동합니다. perldoc -f next을보십시오. 이 경우 정규식이나 더 단순한 일치를 사용하여 적절한 행을 건너 뛸 수 있습니다.
    2. 먼저 분할 한 다음 필요에 따라 각 필드를 처리해야합니다.
    3. 기본 구분 기호 ('|'로 표시 - 분 단위로 표시)로 분할 한 다음 나중에 보조 구분 기호로 최종 입력란을 분할합니다.
    4. 해시가 필요한지 여부를 묻는 경우 확실하지 않습니다. 그렇다면 가장 적합한 (고유 한) 키 세트를 제공 할 항목을 선택해야합니다. 우리는 당신의 데이터를 모르기 때문에 당신을 위해 그렇게 할 수는 없지만, 첫 번째 필드 (한눈에)는 옳았다. 이와 같은 것을 좀 더 복잡한 데이터 구조로 만드는 방법에 대해서는 perldoc perldsc을 보길 원할 것입니다.하지만 지금 당장 혼란스러워 할 수도 있습니다.

    또 다른 한 가지로, 위의 데이터는 첫 번째 줄에 매우 중요한 오타가있는 것처럼 보입니다. 이 줄에서만 첫 번째 필드와 그 구분 기호 사이에 공백이 없습니다. 다른 모든 곳은 '| '. 나는 split에 대해 문제가 될 수 있기 때문에 이것을 언급한다. 나는 이것을 거의 편집했지만 의심 스럽긴하지만 데이터 자체가 불규칙하다.

    초보자가 얼마나 펄인지는 모르겠지만 완전히 익숙하지 않은 분이라면 책에 대한 생각을해야합니다 (온라인 자습서는 매우 다양하고 많은 사람들이 시대에 뒤 떨어진 것입니다). 합리적으로 좋은 입문서는 온라인으로 무료로 사용할 수 있습니다 : Beginning Perl. 또 다른 좋은 옵션은 Learning PerlIntermediate Perl입니다 (실제로 함께 사용합니다).

    1

    이 파일이 줄 기반이면 while 회선에서 한 줄씩 읽을 수 있습니다. 그런 다음 서식이 지정되지 않은 행을 건너 뜁니다.

    그런 다음 다른 대답에 표시된 것처럼 정규식을 사용할 수 있습니다. 내가 그것을 분할하고 배열을 가져 와서 레코드 목록의 해시를 만들 때 사용할 것입니다. 그 후 (또는 전에) 공백을 제거하여 각 레코드를 정리하십시오. regex를 사용하는 경우 캡처 표현식을 사용하여 목록에 추가하십시오. 그것까지 너.

    해시 키가 첫 번째 열이고 목록에 다른 모든 항목이 포함되어 있습니다. 직접 삽입 만하는 경우 목록 목록에서 벗어나 대신 모든 것을 넣을 수 있습니다.

    해시 키를 사용하면 빠른 검색을 위해 특정 레코드를 볼 수 있습니다. 그러나 당신이 그것을 필요로하지 않는다면, 배열은 괜찮을 것입니다. 당신이 하나를 시도 할 수 있습니다

    -2

    ,

    포인트 알아야합니다

    1. 은 '----'라인을 제거, 정규식을 사용하여
    2. 라인
    3. 하여 파일 라인을 읽어 보시기 바랍니다.
    4. 그런 다음 split 함수를 사용하여 배열의 해시를 채 웁니다.

      #!/usr/bin/perl 
          use strict; 
          use warning; 
          my $test_file = 'test.txt'; 
          open(IN, '<' ,"$test_file") or die $!; 
          my (%seen, $id, $name, $timestamp, $PD, $type); 
          while(<IN>){ 
           chomp; 
           my $line = $_; 
           if($line =~ m/^-/){ #removing '---' lines 
           # print "$line:hello\n"; 
           }else{ 
           if ($line =~ /\|/){ 
            ($id , $name, $timestamp) = split /\|/, $line, 4; 
           } else{ 
           ($PD, $type) = split /\//, $line , 3; 
           } 
           $seen{$id}= [$name, $timestamp, $PD, $type]; //use Hashes of array 
           } 
          } 
          for my $test(sort keys %seen){ 
           my $test1 = $seen{$test}; 
           print "$test:@{$test1}\n"; 
          } 
          close(IN); 
      
    +0

    어휘 파일 핸들과 세 인수 형식의 open을 사용하십시오. 조랑말과 무지개 행복. – Telemachus

    +0

    나는 이것에 오랫동안 노력하고있다. .. Chanceless ... 다양한 나쁜 스타일을위한 즉각적인 해결을위한 톤 – Sandhya

    +0

    -0.4. ack = 0), 어업에 관한 책을 읽어야 할 때 남자에게 물고기를주는 또 다른 -0.4. – Ether

    관련 문제