2010-02-10 12 views
5

Eventuali duplicati:
How to read a text file reversely with iterator in C#.net: c'è un modo per leggere un file txt dal basso verso l'alto?

Mi chiedo se c'è un modo per leggere un file di testo dal basso verso l'alto, senza alcuna penalità prestazioni, il readLine, approccio MoveNext, ma invertita , questo genere di cose è possibile in .net?

Per rendere le cose più interessanti del file di testo ha circa 100 000 linee in esso, quindi non posso barare con un ReadAll, invertire ...

Qualche dettaglio in più: ho una collezione di valori stringa in arrivo è preceduto da un ID int che può essere ordinato. Sfortunatamente ottengo questi ID nell'ordine sbagliato. Il problema principale è il volume puro dei valori stringa e nessun RDBMS nella soluzione. Quindi ho davvero bisogno di un modo per memorizzare i valori stringa e quindi invertire l'ordine della memorizzazione durante l'elaborazione. File di testo mi è venuto in mente perché non ho una soluzione migliore in questo momento.

Grazie in anticipo.

+0

Ci deve essere un tipo di metodo "peek" dall'alto. –

+3

non intendi da cima a fondo? –

+1

Sì, dall'alto verso il basso è un po 'il modo standard ... –

risposta

-1

Il metodo ReadBlock della classe StreamReader consente di leggere da una posizione specifica. Non sei sicuro delle prestazioni, potresti semplicemente leggerlo in un array, quindi invertirlo.

+0

Lo farebbe, tranne che io sono oltre il punto di caricarlo tutto in una raccolta a causa di vincoli di memoria e volumi elevati, sfortunatamente. –

+0

ReadBlock consente di leggere * in * una posizione specifica nell'array su cui sta scrivendo. Non consente di specificare l'indice da leggere * da * nel lettore. –

0

Beh, se siete disposti a tuffarsi in profondità si potrebbe presumibilmente utilizzare un lettore di binario e fare la propria lettura ...

che avrebbe dovuto capire la fine riga in senso inverso, e capire come per assicurarti di avere la giusta codifica.

Abbastanza scoraggiante direi.

+0

Hai ragione, è un dolore. Molto interessante però :) –

0

Solo una risposta generale. Se esiste una sorta di metodo peek(), è probabile che tu possa impostare il puntatore del file su filesize (o filesize - 1?) E quindi decrementare il puntatore fino a raggiungere 0. Può esserci qualche classe in .NET che riassume ciò. Ovviamente, devi definire una sorta di dimensione del buffer (in pratica definisci la dimensione dei "blocchi" del file in cui stai leggendo). In tal caso, lo filesize - 1 precedente potrebbe diventare filesize - bufferSize e si aumenterebbe anche il puntatore del file per bufferSize.

0

Penso che si possa fare ciò utilizzando PInvoke per fare ciò tramite WINAPI. È necessario creare un file mappato in memoria, ma solo mappare la fine del file e quindi andare verso l'alto.

0

Quindi si ottengono i valori nell'ordine errato ma si desidera recuperarli nell'ordine corretto. Forse uno

Stack<T> 

Potrebbe funzionare per voi.

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

Rappresenta una dimensione variabile last-in-first-out (LIFO) insieme di istanze dello stesso tipo arbitraria.

+0

Grazie, questa è una grande conoscenza, ma sfortunatamente originariamente compilo il mio elenco usando una serie di chiamate batch, altrimenti funzionerebbe benissimo. –

1

Perché non utilizzare il metodo ReadToEnd() di una classe StreamReader, quindi lavorare all'indietro ... Certo, non è bello ma funziona, ho usato un array di byte per creare un'istanza MemoryStream e l'uso che per l'istanza StreamReader, utilizzando il puntatore hocus-pocus, i dati vengono letti all'indietro.

 
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); 
      } 
     } 
    } 
} 

Spero che questo aiuti, i migliori saluti, Tom.

+0

dang! appena pubblicato questo prima che si chiudesse quando stavo testando il codice ... sospiro – t0mm13b

Problemi correlati