2016-08-12 1 views
-1

내가 모든 라인 내 경우에는 다음 6220에 6220로 시작 읽고 싶어읽기 여러 줄은

6200MIGS Draft Capture    001527160719256                                                    
98769 2030000000002385250000000000000000000000000719024031629498071912403119100719301201208620112629498  00QFCBA003353109297315583010 036000000190 100   000000 SHOEBRIDGE/DANIEL T MR  VI50 0818950138744 600110190 
6221QANTAS AIR               AUSTRALIA  036    T                                       
6223  0000000000000000000                                                         
6229SHOEBRIDGE/DANIEL T MR       0818950138744 QF YNOGVJ       15022602300045          -00000238525000000000000000000000000005               
62301702281700BNE   MEL QF H XHLFEU   631        000000000000000000000000000000000000                                 
62311702282335MEL   DXB QF H XHLFEU    9        000000000000000000000000000000000000                                 
62321703011450DXB   LYS QF H OHLFEU   8081        000000000000000000000000000000000000                                 
62331703082115CDG   DXB QF O XOLREU1   8076 0818950138745     000000000000000000000000000000000000                                 
62341703091025DXB   BNE QF O OLREU1   8434 0818950138745     000000000000000000000000000000000000                                 
622001005123456789QFCBA003353109297315583000 036000000190 100   000000 DETTMAN/GLEN MR    CA50 0818950138719 600110190 
6221QANTAS AIR               AUSTRALIA  036    T                                       
6222   0719   000                                                         
6229DETTMAN/GLEN MR         0818950138719 QF YYUGBM       15022602300045          -00000057565000000000000000000000000002               
62301703151800MEL   SYD QF L OLPTSCN01  458        000000000000000000000000000000000000                                 
62311703251830SYD   MEL QF M MPTSCN01  463        000000000000000000000000000000000000 

아래와 같이 텍스트 파일이 기록으로 시작하는 접두사를 기반으로하고이를 처리하는 라인은 2-9이고 나는 레코드로 부를 것이다. 그런 다음 시작 접두사를 기반으로 레코드의 각 줄을 처리하고 싶습니다. 예를 들어 6223으로 시작하면 필요한 데이터를 추출합니다. 내 질문에 어떻게 레코드로 줄을 읽고 다음 개별적으로 처리 할 수 ​​있습니다.

가 표시되고 다시 내가 지금까지입니다했다 advance.The 코드에 도움이 .thanks 될 것

여기
File infile = new File("C:\\Data\\Everyday work\\tmp\\CBRF.GEN4_FILE.20160719.txt"); 
    File outfile = new File("C:\\Data\\Everyday work\\tmp\\CBRF.GEN4_FILE.20160719.txt-DCFOUT.txt"); 
    FileReader reader; 
    Scanner scanner; 
    public void output() { 

     try { 

      FileWriter writer = new FileWriter(outfile); 
      reader = new FileReader(infile); 
      BufferedReader br = new BufferedReader(reader); 
      String str; 
      BufferedWriter bw = new BufferedWriter(writer); 
      bw.flush();  
      while ((str = br.readLine())!= null) { 


       scanner = new Scanner(str); 

       String line = scanner.nextLine(); 
       if (line.startsWith("6220", 0)) { 

        recordtype = line.substring(0, 4); 
        msgrtypId = line.substring(4, 8); 

       }  
      } 
    } 

난 라인으로 라인을 읽을 수 있습니다 무엇을 달성하려고하는 것은 라인 사이의 라인을 읽는 것입니다 (6220) 및 다음 라인 프리픽스 (6220)를 레코드로서 포함한다.

+0

글쎄, 텍스트 파일에서 문자열을 읽는 코드를 작성하는 것으로 시작할 것입니다. 또는 당신의 질문은 정확히 무엇입니까? – GhostCat

+0

먼저 파일을 열고'BufferedReader'를 사용하여 파일을 한 줄씩 읽습니다. 아니면 간단합니다 : 당신은 몇 가지 코드를 작성하여 시작합니다. * 그 다음 *, 당신이 곤란을 겪으면, 당신은 우리에게 당신이 가지고있는 코드와 당신이 코드와 관련된 * 특정 문제에 대한 설명을 보여줍니다. – Andreas

+0

질문 작성자가 시도하지 않은 코드 작성 요청이므로이 질문을 주제와 관련이없는 것으로 닫으려고합니다. – Andreas

답변

1

문제를 해결하는 것은 일반적으로 유용한 추상화를 만드는 것입니다. 당신은 여전히 ​​"낮은 레벨"에 대해서 가정해야합니다. 코드는 파일에서 한 줄을 읽습니다. 그리고 바로 거기에서 처리를 시작합니다.

그래서, 다시 단계 수와 "높은 곳"에 들어 가려고 : 모든

첫째, 모든 "흥미로운"라인은 6220로 시작합니까? 또는이 줄이 특정 형식을 가지고 있다는 점입니다. 새로운 기록이 시작된다는 것을 알려줍니다. 알다시피, 그것은 매우 중요합니다. 왜냐하면 나중에 사실이라면 6220으로 시작하는 줄을 찾지 않아야합니다. 레코드 형식은 "여기에서 시작합니다"resp. "기록은 여기에서 끝납니다".

다음 질문은 다음과 같습니다. 다른 행 ?! 그들은 무시되어야 하는가? 아니면 다른 처리를해야합니까?

그렇다면 여기서 제약이 있습니까? 의미 : 전체 파일을 단순히 읽는 것이 좋습니다. 처리를하기 전에 메모리에 보관하십시오. 또는이 파일은 정말로 큰 파일입니다. 너무 커서, 환경 내에서 전체를 메모리로 읽지 않는 것이 좋을까요?

귀하의 질문에이 모든 정보가 부족합니다. 그리고 심각하게 : 당신이 모든 것을 하나의 질문 (또는 대답)으로 말하려고한다면 사태가 비례해질 것입니다.

하지만 시작 코드를 알려 드리겠습니다.

// before your loop starts 
boolean currentlyParsingRecord = false; 
boolean List<String> rawRecordLines = new ArrayList<>(); 

// within your loop 
String line = scanner.nextLine(); 
if (currentlyParsingRecord) { 
    if (line.startsWith("6220)) { 
    currentlyParsingRecord = false; 
    } 
    rawRecordLines.add(line); 
} else { 
    if (line.startsWith("6220)) { 
    currentlyParsingRecord = true; 
    rawRecordLines.add(line); 
    // and now, maybe you are calling a method like 
    processRecordLines(rawRecordLines); 
    // and then you clear your "buffer" 
    rawRecordLines.clear(); 
    } 
} 

요점은 : 어떻게 든 함께 속해 라인을 수집하는 당신은. 여기에 간단한 목록을 사용하고 있습니다. 그런 다음 해당 레코드의 데이터를 처리하기 위해 해당 목록을 전달하기 만하면됩니다 (물론 "버퍼"를 지우는 것을 잊어서는 안됩니다; 다음 레코드를 수집하기 시작할 수도 있습니다). 주의 사항 : 물론 이것이 최종 해결책은 아닙니다. 그것은 단지 당신에게 여기에서 어떻게 나아갈지를 생각해야합니다. 그런 것들은 실제로 옳은 것을 얻기에는 꽤 복잡 할 수 있습니다. 그리고, 당신은 본다; 실제로 이것은 여전히 ​​매우 "저수준"구현입니다. 그래서 "현명한 디자인"을위한 개선의 여지가 많이 있습니다.

희망이 있습니다. 그러나 말했듯이 : 프로그래밍에 더 몰입하기 전에; 요구 사항을보다 명확하게 설명하십시오. 너는 앉아야한다. 주위의 사람들과 이야기하십시오. 실제로 그 파일 내에서 처리 할 방법/방법을 이해할 수 있습니다. 당신이 그렇게하지 않으면; 기회가 꽤 많으므로 오늘 구현할 것이 무엇이든 내일은 더 이상 충분하지 않을 것입니다.

+0

코드를 보내 주셔서 감사합니다. 귀하의 질문에 대한 나는 그 질문을 프레임 방식은 혼란스러워 내가 최선을 다해 그것을 명확하게하려고 생각합니다. –

+0

당신은 환영합니다. 목표를 달성하는 데 도움이된다면 제 대답을 수락하십시오. – GhostCat

+0

코드를 기반으로 목표를 달성했습니다. 아이디어를 내 주셔서 대단히 감사합니다. 나는 너의 대답을 받아 들였다. –