2010-02-10 2 views
5

Можно создать дубликат:
How to read a text file reversely with iterator in C#.net: Есть ли способ прочитать txt-файл снизу вверх?

мне интересно, если есть способ, чтобы прочитать текстовый файл снизу вверх без какого-либо ущерба для производительности, то Readline, MoveNext подход, но с инверсией , возможно ли это в .net?

Чтобы сделать дела более интересным текстовый файл имеет около 100 000 строк в ней, поэтому я не могу обмануть с ReadAll, обратный ...

Некоторые более подробно: У меня есть набор входящих значений строк который имеет префикс идентификатора int, который можно сортировать. К сожалению, я получаю эти идентификаторы в неправильном порядке. Основная проблема заключается в явном объеме строковых значений, а в решении нет РСУБД. Поэтому мне действительно нужен способ сохранить строковые значения, а затем изменить порядок хранения во время обработки. Текстовый файл пришел на ум, потому что на данный момент у меня нет лучшего решения.

Заранее спасибо.

+0

Должен быть какой-то низкий метод «заглянуть». –

+3

Разве вы не имеете в виду внизу? –

+1

Да, сверху донизу это стандартный способ ... –

ответ

-1

Метод ReadBlock класса StreamReader позволяет читать из определенной позиции. Не уверен в производительности, вы можете просто прочитать его в массиве, а затем отменить его.

+0

Сделал бы, за исключением того, что я не могу полностью загрузить его в коллекцию из-за ограничений памяти и больших объемов, к сожалению. –

+0

ReadBlock позволяет читать * в * определенную позицию в массиве, в который он пишет. Он не позволяет вам указывать индекс для чтения * из * внутри читателя. –

0

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

Вы должны были бы выяснить конец строки в обратном порядке, и выяснить, как чтобы убедиться, что у вас есть правильная кодировка.

Довольно сложный, я бы сказал.

+0

Вы правы, это боль. Довольно интересно, хотя :) –

0

Просто общий ответ. Если есть какой-то метод peek(), возможно, вы можете установить указатель на файл filesize (или filesize - 1?), А затем уменьшить указатель до достижения 0. В .NET может быть некоторый класс, который абстрагирует это. Конечно, вам нужно определить какой-то размер буфера (в основном определить размер «кусков» файла, который вы читаете). В этом случае filesize - 1 выше может стать filesize - bufferSize, и вы также будете увеличивать указатель на файл на bufferSize.

0

Думаю, вы можете это сделать, используя PInvoke, чтобы сделать это через WINAPI. Вам нужно создать файл с отображением памяти, но только отобразить конец файла, а затем перейти вверх.

0

Таким образом, вы получаете значения в неправильном порядке, но хотите их вернуть в правильном порядке. Возможно,

Stack<T> 

Будет работать для вас.

http://msdn.microsoft.com/en-us/library/3278tedw.aspx

Представляет переменный размер последнего в первый вышел (LIFO) коллекции экземпляров одного и того же произвольного типа.

+0

Спасибо, это большие знания, но, к сожалению, я изначально заполнял свой список, используя серию пакетных звонков, иначе это было бы отлично. –

1

Почему бы не использовать метод класса StreamReader ReadToEnd(), а затем работать обратно ... Понятно, что это не очень хорошо, но он работает, я использовал массив байтов для создания экземпляра MemoryStream и использования для экземпляра StreamReader, используя указатель hocus-pocus, данные считываются в обратном порядке.

 
unsafe 
{ 
    byte[] b = System.Text.ASCIIEncoding.ASCII.GetBytes("Hello World! Foo wuz ere and so wuz bar"); 
    using (MemoryStream mStream = new MemoryStream(b)) 
    { 
     string readStr; 
     using (StreamReader sr = new StreamReader(mStream)) 
     { 
      readStr = sr.ReadToEnd(); 
     } 
     Console.WriteLine(readStr); 
     fixed (char* beg = readStr) 
     { 
      char* p = beg + readStr.Length; 
      while (p-- != beg) 
      { 
       Console.Write(*p); 
      } 
     } 
    } 
} 

Надеется, что это помогает, С наилучшими пожеланиями, Том.

+0

dang! просто отправил это, прежде чем он закрылся, когда я тестировал код ... вздох – t0mm13b

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