2009-11-20 5 views
0

가능한 중복 :
How to parse this output and separate each field/word구분 기호로 텍스트를 구문 분석하는 방법은 무엇입니까?

내가 아래에 지정된대로 내가 출력을 얻을 수 있도록, 다음 데이터를 구문 분석합니다.

입력 :

 
RTRV-ALM-EQPT::ALL:RA01; 

    SIMULATOR 09-11-20 13:52:15 
M RA01 COMPLD 
    "SLOT-1-1-1,CMP:MN,T-FANCURRENT-1-HIGH,NSA,01-10-09,00-00-00,,:\"Fan-T\"," 
    "SLOT-1-1-1,CMP:MJ,T-BATTERYPWR-2-LOW,NSA,01-10-09,00-00-00,,:\"Battery-T\"," 
    "SLOT-1-1-2,CMP:CR,PROC_FAIL,SA,09-11-20,13-51-55,,:\"Processor Failure\"," 
    "SLOT-1-1-3,OLC:MN,T-LASERCURR-1-HIGH,SA, 01-10-07,13-21-03,,:\"Laser-T\"," 
    "SLOT-1-1-3,OLC:MJ,T-LASERCURR-2-LOW,NSA, 01-10-02,21-32-11,,:\" Laser-T\"," 
    "SLOT-1-1-4,OLC:MN,T-LASERCURR-1-HIGH,SA,01-10-05,02-14-03,,:\"Laser-T\"," 
    "SLOT-1-1-4,OLC:MJ,T-LASERCURR-2-LOW,NSA,01-10-04,01-03-02,,:\"Laser-T\"," 
; 

출력 :

 
1) RTRV-ALM-EQPT::ALL:RA01; 
2) SIMULATOR 
3) 09-11-20 
4) 13:52:15 
5) M 
6) RA01 
7) COMPLD 
8) "SLOT-1-1-1,CMP:MN,T-FANCURRENT-1-HIGH,NSA,01-10-09,00-00-00,,:\"Fan-T\"," 
9) "SLOT-1-1-1,CMP:MJ,T-BATTERYPWR-2-LOW,NSA,01-10-09,00-00-00,,:\"Battery-T\"," 
10) "SLOT-1-1-2,CMP:CR,PROC_FAIL,SA,09-11-20,13-51-55,,:\"Processor Failure\"," 
11) "SLOT-1-1-3,OLC:MN,T-LASERCURR-1-HIGH,SA, 01-10-07,13-21-03,,:\"Laser-T\"," 
12) "SLOT-1-1-3,OLC:MJ,T-LASERCURR-2-LOW,NSA, 01-10-02,21-32-11,,:\" Laser-T\"," 
13) "SLOT-1-1-4,OLC:MN,T-LASERCURR-1-HIGH,SA,01-10-05,02-14-03,,:\"Laser-T\"," 
14) "SLOT-1-1-4,OLC:MJ,T-LASERCURR-2-LOW,NSA,01-10-04,01-03-02,,:\"Laser-T\"," 
+0

그래서 \ escped quotes를 포함 할 수있는 따옴표 안에 공백을 두지 마십시오. –

+0

이 질문은 세 번째 질문이라고 생각합니다. 그것은 일종의 숙제인가? –

답변

0

모든 입력이 구조를 알고 있어야 구문 분석하십시오.

  1. 처음 네 줄은 항상 표시됩니까?
  2. 이 네 줄 각각의 형식은 무엇입니까?
1

가장 좋은 방법은 첫 번째 텍스트를 두 번째 텍스트로 변환하는 것을 생각하지 않는 것입니다.

먼저, 첫 번째 텍스트를 실제로 구문을 나타내는 Java 객체 집합으로 구문 분석한다고 생각해보십시오. 예를 들어, 입력의 두 번째/세 번째 줄은 "area", "day"및 "time"속성이있는 Test 클래스로 나타낼 수 있습니다. (모든 것의 의미에 대한 지식을 기반으로 합당한 모델을 제시 할 수 있습니다.)

그런 다음 파일 정보가 메모리에 잘 표시되면 두 번째 경우와 마찬가지로 텍스트로 인쇄하는 것이 좋습니다. 즉석에서 입력 텍스트를 변환하는 대신 자바 객체의 다양한 필드와 속성을 인쇄하는 것이 매우 쉽습니다.

1

파일이 비교적 작다고 가정하면 메모리로 읽어 들일 수 있습니다. 이런 식으로 뭔가를 시도 :

public class Main { 
    public static void main(String[] args) { 
     String text = "RTRV-ALM-EQPT::ALL:RA01;\n"+ 
      "\n"+ 
      " SIMULATOR 09-11-20 13:52:15\n"+ 
      "M RA01 COMPLD\n"+ 
      " \"SLOT-1-1-1,CMP:MN,T-FANCURRENT-1-HIGH,NSA,01-10-09,00-00-00,,:\\\"Fan-T\\\",\"\n"+ 
      " \"SLOT-1-1-1,CMP:MJ,T-BATTERYPWR-2-LOW,NSA,01-10-09,00-00-00,,:\\\"Battery-T\\\",\"\n"+ 
      " \"SLOT-1-1-2,CMP:CR,PROC_FAIL,SA,09-11-20,13-51-55,,:\\\"Processor Failure\\\",\"\n"+ 
      " \"SLOT-1-1-3,OLC:MN,T-LASERCURR-1-HIGH,SA, 01-10-07,13-21-03,,:\\\"Laser-T\\\",\"\n"+ 
      " \"SLOT-1-1-3,OLC:MJ,T-LASERCURR-2-LOW,NSA, 01-10-02,21-32-11,,:\\\" Laser-T\\\",\"\n"+ 
      " \"SLOT-1-1-4,OLC:MN,T-LASERCURR-1-HIGH,SA,01-10-05,02-14-03,,:\\\"Laser-T\\\",\"\n"+ 
      " \"SLOT-1-1-4,OLC:MJ,T-LASERCURR-2-LOW,NSA,01-10-04,01-03-02,,:\\\"Laser-T\\\",\"\n"+ 
      ";"; 
     Matcher m = Pattern.compile("\"(?:\\\\.|[^\\\"])*\"|\\S+").matcher(text); 
     int n = 0; 
     while(m.find()) { 
      System.out.println((++n)+") "+m.group()); 
     } 
    } 
} 

출력 :

1) RTRV-ALM-EQPT::ALL:RA01; 
2) SIMULATOR 
3) 09-11-20 
4) 13:52:15 
5) M 
6) RA01 
7) COMPLD 
8) "SLOT-1-1-1,CMP:MN,T-FANCURRENT-1-HIGH,NSA,01-10-09,00-00-00,,:\"Fan-T\"," 
9) "SLOT-1-1-1,CMP:MJ,T-BATTERYPWR-2-LOW,NSA,01-10-09,00-00-00,,:\"Battery-T\"," 
10) "SLOT-1-1-2,CMP:CR,PROC_FAIL,SA,09-11-20,13-51-55,,:\"Processor Failure\"," 
11) "SLOT-1-1-3,OLC:MN,T-LASERCURR-1-HIGH,SA, 01-10-07,13-21-03,,:\"Laser-T\"," 
12) "SLOT-1-1-3,OLC:MJ,T-LASERCURR-2-LOW,NSA, 01-10-02,21-32-11,,:\" Laser-T\"," 
13) "SLOT-1-1-4,OLC:MN,T-LASERCURR-1-HIGH,SA,01-10-05,02-14-03,,:\"Laser-T\"," 
14) "SLOT-1-1-4,OLC:MJ,T-LASERCURR-2-LOW,NSA,01-10-04,01-03-02,,:\"Laser-T\"," 
15) ; 

유일한 차이는 15 일치라는 것이다 다음 ;, 당신은 잊고, 저는 믿습니다.

(모든 이스케이프없이) 원시 정규식은 다음과 같습니다

"(?:\\.|[^\\"])*"|\S+ 

과 일치 :

"   # match a double quote 
(?:  # open non matching group 1 
    \\.  # match a backslash followed by any char (except line breaks) 
    |  # OR 
    [^\\"] # match any char except a backslash and a double quote 
)*   # close non matching group 1 and repeat it zero or more times 
"   # match a double quote 
|   # OR 
\S+  # match one or more characters other than white space chars 

: 경기 인용 된 문자열 또는 단독으로 구성된 단어 일치를 공백이 아닌 문자.

+0

그레이트 대답 : –

+0

감사합니다 안드레아스. –

관련 문제