Vấn đề: Tệp rất lớn, tôi cần phân tích từng dòng để nhận 3 giá trị từ mỗi dòng. Tất cả mọi thứ hoạt động nhưng phải mất một thời gian dài để phân tích cú pháp thông qua toàn bộ tệp. Có thể thực hiện việc này trong vài giây không? Thời gian tiêu biểu của nó là từ 1 phút đến 2 phút.Có cách nào nhanh chóng để phân tích cú pháp thông qua một tệp lớn với regex không?
kích thước tập tin Ví dụ là 148,208KB
Tôi đang sử dụng regex để phân tích qua từng dòng:
Đây là C# mã của tôi:
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);
}
}
Đây là regex của tôi:
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;
}
Dưới đây là một dòng ví dụ để phân tích cú pháp, thường là khoảng 200.000 dòng:
10.10.10.10 - - [27/tháng mười một/2002: 16: 46: 20 -0500] "GET/Solr/HTTP/1.1" 200 4926 789
Tôi không thực sự là chuyên gia, nhưng tôi không thấy bất cứ điều gì không đúng chỗ. – Almo
câu trả lời ngắn gọn: không, bạn không thể phân tích cú pháp mỗi dòng 150 mb dữ liệu chỉ trong vài giây –
Vâng, đó là những gì tôi nghĩ, nhưng không chắc liệu tôi có đủ thông minh để nghĩ về một số ký hiệu O lớn để làm cho điều này nhanh hơn. – Rayshawn