2010-07-26 2 views
2

특정 태그의 위치 (색인)에 대해 2,8GB XML 파일을 스캔했습니다. 나는 Seek 메서드를 사용하여 해당 파일의 시작점을 설정합니다. 파일은 UTF-8로 인코딩됩니다. 그래서 색인은 같다 :색인 생성 된 XML 파일의 문제점


using(StreamReader sr = new StreamReader(pathToFile)){ 
    long index = 0; 
    while(!sr.EndOfStream){ 
    string line = sr.ReadLine(); 
    index += (line.Length + 2); //remeber of \r\n chars 

    if(LineHasTag(line)){ 
     SaveIndex(index-line.Length); //need beginning of the line 
    } 
    } 
} 

그래서 나중에 내가 가지고있는 다른 파일 인덱스 위치에. 그러나 내가 추구하는 것을 사용하면 위치가 좋아지기 전에 어딘가에 설정되기 때문에 좋은 것으로 보이지 않습니다. char 배열에 해당 파일의 일부 내용을로드하고 필요한 태그의 인덱스를 수동으로 확인했습니다. 위의 코드로 색인 한 것과 같습니다. 하지만 여전히 Seek 메서드에 StreamReader.BaseStream 포인터를 파일의 앞에 배치합니다. 아주 이상합니다.

제안 사항? 당신이 문자 당 1 바이트있다 가정하고 -

안부, 벤투스는

답변

2

바이트에 거래를 구한다. UTF-8에서 BMP의 한 문자는 최대 3 바이트까지 사용할 수 있습니다.

내 생각에 파일에 ASCII가 아닌 문자가있는 것 같습니다. 문자가 2 바이트 이상 걸릴 것입니다.

내가 생각할 경우 도 바이트 순서 표시에 잠재적 인 문제점이있을 수 있습니다. 나는 StreamReader이 자동으로 그것을 삼킬 지 여부를 기억하지 못한다. 이것은 3 바이트로 시작할 것이다.

+0

글쎄, 그건 사실이야, 그 파일에 비 ASCII 문자가 있습니다. 그런 다음 올바르게 색인을 생성하는 방법은 무엇입니까? – Ventus

+1

@Ventus :'Encoding.GetByteCount (line)'을 호출하면 모든 것이 동기화 상태로 유지되기를 바랍니다. 나는 그것이 불가능할 상황을 즉시 생각할 수 없다. –

+0

지금은 더 좋아 보인다. 나는 지금 그것을 시험해야한다. 나는 아직도 가끔은 완벽하지는 않지만, 괜찮을 것 같아. – Ventus