2010-06-03 5 views
3

매우 큰 파일 (각 줄마다 하나씩 길이가 변함)을 파싱 중이며 파일에서 읽은 바이트 수를 추적하여 이벤트에서 복구 할 수 있습니다. 실패의.TextReader.ReadLine()에서 읽은 바이트 수는 어떻게 계산합니까?

using (TextReader myTextReader = CreateTextReader()) 
{ 
    string record = myTextReader.ReadLine(); 
    bytesRead += record.Length; 
    ParseRecord(record); 
} 

그러나이 ReadLine() 스트립 라인의 모든 CR/LF 문자 때문에 작동하지 않습니다

나는 다음과 같은 썼다. 또한 한 줄은 CR, LF 또는 CRLF 문자로 종료 될 수 있으므로 bytesRead에 1을 더할 수 없습니다.

실제 줄 길이를 쉽게 얻을 수있는 방법이 있습니까? Read() 작업과 관련하여 직접 ReadLine() 메서드를 작성합니까?

답변

2

StreamReader가 스트림에서 읽은 데이터를 버퍼하므로 기본 스트림의 현재 위치를 가져 오는 것이 도움이되지 않습니다.

기본적으로 자신의 StreamReader를 작성하지 않으면이 작업을 수행 할 수 없습니다. 하지만 정말로해야하니?

나는 단순히 읽은 행의 수를 셉니다.

물론 이것은 특정 줄에 위치 시키려면 단순히 오프셋을 찾는 것보다는 N 줄을 읽어야한다는 것을 의미하지만 그 점이 무엇입니까? 실적이 용납 될 수 없다고 결정하셨습니까?

0

생각해 보니 StreamReader을 사용하고 다음과 같이 기본 스트림의 현재 위치를 가져올 수 있습니다.

using (StreamReader myTextReader = CreateStreamReader()) 
{ 
    stringRecord = myTextReader.ReadLine(); 
    bytesRead += myTextReader.BaseStream.Position; 
    ParseRecord(record); 
    // ... 
} 
+2

기본 스트림이 검색을 지원하는 경우에만 작동하며 이는 사용자의 경우에 효과적 일 수 있지만 모든 경우에이 방법이 작동하지 않는다는 점을 지적해야합니다. –

+2

BaseStream이 청크로 진행되는 곳에서 StreamReader가 버퍼링되는 경우에도 문제가있을 수 있습니다. – sisve

+0

성능상의 이유로 TextReader는 기본 스트림을 바이트 단위가 아닌 4096 바이트 단위로 읽으 므로이 방법은 확실히 작동하지 않습니다. 이것은 실제로 시몬이 말한 것과 동일합니다. –

1

TextReader는 [인코딩에 따라] 문자가 문자열이 아닌 바이트를 읽습니다.

단지 읽은 줄 수를 저장하는 것이 좋으며 복구 할 때 여러 줄을 건너 뛰는 방법은 무엇입니까? 나는 그 줄을 처리하지 않는 것이 전부라고 생각합니다. 반드시 줄에서 읽는 것을 피하는 것은 아닙니다.

+0

필자의 경우, 필자가 읽고있는 파일에 1 바이트 ASCII 문자가 있다고 가정 할 수 있습니다. 또한 줄 번호를 저장할 수 있지만 스트림에서 앞으로 탐색하기를 원했습니다. 이미 구문 분석 한 각 줄을 읽지 않아도됩니다 (줄은 고정 길이가 아닙니다). –

관련 문제