2013-04-24 3 views
1

하여 큰 파일 처리 섹션을 읽기 :내가 같은 형식은 큰 텍스트 파일이 있다고 가정 섹션

제 START를 ... ... ... 섹션 END 섹션 START .... ... ... 섹션 END ....

내가 파일을 구문 분석하고 싶은 그러나 나는 메모리의 전체 내용을 유지하지 않으려는, 그것을 섹션별로 소비, 난을 읽을 수 섹션에 몇 가지 작업을 수행하십시오. DB에 삽입 한 다음 버리고 다음 섹션을 계속 읽으십시오. 어떻게해야합니까? 나는 가변적 인 변수를 조작함으로써 구현을 해낼 수있다.

답변

2

당신은 항상 (꼬리) 재귀 함수 *

def parseLines(
    in: Iterator[String], 
    thisSection: List[String] = Nil, 
    results: List[Foo] = Nil 
): List[Foo] = { 
    if (!in.hasNext) results.reverse 
    else in.next match { 
    case "SECTION END" => 
     val section = thisSection.reverse.drop(1) 
     // Do something with data 
     val foo = // whatever you need to store from this section 
     parseLines(in, Nil, foo :: results) 
    case s => 
     parseLines(in, s :: thisSection, results) 
    } 
} 

를 작성하여 이러한 종류의 문제점을 해결할 수 있지만,이 가변 변수를 사용하는 것보다 이렇게하는 것이 더 나은 아니다. 핵심은 변경 가능성있는 상태가 누출되어 프로그램의 나머지 부분에서 논리를 복잡하게 만들지 않도록 변경 가능성을 잘 지키는 것입니다. 누산기 변수를 재귀 적으로 만드는 대신에 이와 같은 메소드 안에 추가하는 것은 완벽합니다. 논리가 더 명확 해 지도록 선택하십시오.

* 꼬리 재귀가 더 좋거나 스택이 오버플로되는 것이 좋습니다. 확인하려면 @tailrec 주석을 사용하십시오.

관련 문제