Ho un file piuttosto grande composto da diversi milioni di righe e vi è la necessità di controllare e rimuovere le righe danneggiate dal file.lettura e modifica di file di testo di grandi dimensioni 3-5 GB
Ho provato spudoratamente File.ReadAllLines
ma non ha funzionato. Poi ho provato a eseguire lo streaming delle righe come di seguito la lettura dal file originale e la scrittura di uno nuovo. Mentre fa il lavoro, lo fa in diverse ore (5+). Ho letto sull'utilizzo di buffer che suona come l'unica opzione, ma come faccio a mantenere l'integrità della linea in questo modo?
Soluzione: StreamWriter spostato all'esterno. Invece di split, viene utilizzato il conteggio.
using (FileStream inputStream = File.OpenRead((localFileToProcess + ".txt")))
{
using (StreamReader inputReader = new StreamReader(inputStream, System.Text.Encoding.GetEncoding(1254)))
{
using(StreamWriter writer=new StreamWriter(localFileToProcess,true,System.Text.Encoding.GetEncoding(1254)))
{
while (!inputReader.EndOfStream)
{
if ((tempLineValue = inputReader.ReadLine()).Count(c => c == ';') == 4)
{
writer.WriteLine(tempLineValue);
}
else
incrementCounter();
}
}
}
}
Nota che Split (';') assegna un array e crea 5 stringhe in memoria per ogni riga. Questo aggiunge lavoro per un garbage collector. Forse dovresti controllare che ci siano 4 punti e virgola nella tua linea? Inoltre ogni iterazione si sta creando/disponendo StreamWriter. Non è meglio crearne uno all'inizio e smaltirlo alla fine dell'operazione? – Artemix
buon punto. Farò i cambiamenti. – mechanicum
che ne dici di leggere un batch in un generatore di stringhe, elaborare e quindi scrivere tutto in una volta? – bhs