2010-07-26 2 views
2

Я просмотрел XML-файл размером 2,8 ГБ для позиций (указатель) определенных тегов. Я использую метод 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 
    } 
    } 
} 

Так после этого я в другой файл индексируется позиции. Но когда я пользуюсь поиском, это не кажется хорошим, потому что позиция установлена ​​где-то раньше. Я загрузил некоторое содержимое этого файла в массив символов, и я вручную проверил хороший индекс тега, который мне нужен. Это то же самое, что я проиндексировал кодом выше. Но все же метод Seek на StreamReader.BaseStream помещает указатель ранее в файл. Довольно странно.

Любые предложения?

С наилучшими пожеланиями, Ventus

ответ

2

Ищите предложения в байтах - Вы предполагаете, есть один байт на символ. В UTF-8 один символ в BMP может принимать до трех байтов.

Я предполагаю, что у вас есть символы, отличные от ASCII, в вашем файле - это займет более одного байта.

Я думаю, что может также быть потенциальной проблемой с отметкой о байтовом порядке, если таковой имеется. Я не могу забыть, будет ли StreamReader автоматически проглатывать, что позволит вам начать с 3 байтов.

+0

Ну, это правда, в этом файле есть символы, отличные от ASCII. Тогда как правильно его проиндексировать? – Ventus

+1

@Ventus: Вы можете называть 'Encoding.GetByteCount (строка)' и надеяться, что все будет синхронизироваться. Я не могу сразу думать о ситуациях, когда этого не произойдет. –

+0

Кажется, теперь лучше. Я должен проверить это сейчас. Я могу это все еще иногда это не идеально, но я надеюсь, что все будет в порядке. – Ventus

Смежные вопросы