Problema: File molto molto grande, ho bisogno di analizzare riga per riga per ottenere 3 valori da ciascuna riga. Tutto funziona ma richiede molto tempo per analizzare l'intero file. È possibile farlo in pochi secondi? Il tempo tipico è tra 1 minuto e 2 minuti.Esiste un modo veloce per analizzare un file di grandi dimensioni con espressioni regolari?
dimensione del file di esempio è 148,208KB
Sto usando regex per analizzare attraverso ogni linea:
Ecco il mio codice C#:
private static void ReadTheLines(int max, Responder rp, string inputFile)
{
List<int> rate = new List<int>();
double counter = 1;
try
{
using (var sr = new StreamReader(inputFile, Encoding.UTF8, true, 1024))
{
string line;
Console.WriteLine("Reading....");
while ((line = sr.ReadLine()) != null)
{
if (counter <= max)
{
counter++;
rate = rp.GetRateLine(line);
}
else if (max == 0)
{
counter++;
rate = rp.GetRateLine(line);
}
}
rp.GetRate(rate);
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
Ecco la mia espressione regolare:
public List<int> GetRateLine(string justALine)
{
const string reg = @"^\d{1,}.+\[(.*)\s[\-]\d{1,}].+GET.*HTTP.*\d{3}[\s](\d{1,})[\s](\d{1,})$";
Match match = Regex.Match(justALine, reg,
RegexOptions.IgnoreCase);
// Here we check the Match instance.
if (match.Success)
{
// Finally, we get the Group value and display it.
string theRate = match.Groups[3].Value;
Ratestorage.Add(Convert.ToInt32(theRate));
}
else
{
Ratestorage.Add(0);
}
return Ratestorage;
}
Ecco una riga di esempio da analizzare, in genere circa 200.000 righe:
10.10.10.10 - - [27/Nov/2002: 16: 46: 20 -0500] "GET/solr/HTTP/1.1" 200 4926 789
io non sono davvero un esperto, ma non si vede nulla fuori posto. – Almo
risposta breve: no, non è possibile analizzare ogni riga di 150 mb di dati in pochi secondi –
Sì, è quello che ho pensato anch'io, ma non ero sicuro di non essere abbastanza intelligente da pensare a qualche notazione O grande per renderlo più veloce. – Rayshawn