Исключение при парсинге файлов - C#
Формулировка задачи:
Есть программа
Вроде прописал цикл что пока не закончатся файлы,продолжать работу(файлы прикреплены ниже)
Он открыл 2 файла,а остальные 2 он не открыл и выкинул исключение.
Мне нужно принять свои файлы и распарсить их,что я делаю не так уже при изъятии пути к каталогу.
Я создал отдельную тему так как вопрос другой уже.
using System;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Data;
using System.Collections;
using System.Text.RegularExpressions;
using System.Threading;
using System.Text;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace LabWork2
{
public class Line
{
public string User;
public string Address;
public int Traffic;
public DateTime Date;
public string ToCsv(bool header = false)
{
var s = ", ";
return header
? String.Concat("User", s, "Address", s, "Traffic", s, "Date")
: String.Concat(
this.User, s,
this.Address, s,
this.Traffic, s,
this.Date.ToString("d.MM"));
}
public static IEnumerable<Line> Parse(string logDir, string pattern = "log?.txt", int skip = 0)
{
string result = Path.GetFileName(pattern);
foreach (var file in Directory.EnumerateFiles(logDir, result))
{
//foreach (var file in Directory.GetFiles(logDir,result))
// while()
while (File.Exists(pattern))
{
foreach (var line in ParseFile(logDir, file, 1))
yield return line;
}
}
}
public static IEnumerable<Line> ParseFile(string logDir,string file, int skip = 0)
{
return Parse(logDir,file, skip);
}
}
class Stat
{
public class Item
{
public string Key;
public string Address;
public int Traffic;
public DateTime From;
public DateTime To;
public string ToCsv(bool header=false)
{
var s = ", ";
return header
? String.Concat("Key", s, "Traffic", s, "From", s, "To")
: String.Concat(
this.Key, s,
this.Traffic, s,
this.From.ToString("d.MM"), s,
this.To.ToString("d.MM"));
}
public string ToCsv1(bool header = false)
{
var s = ", ";
return header
? String.Concat("Adress", s, "Traffic", s)
: String.Concat(
this.Address, s,
this.Traffic, s);
}
public string ToCsv2(bool header = false)
{
var s = ", ";
return header
? String.Concat( "Traffic", s, "From", s, "To")
: String.Concat(
this.Traffic, s,
this.From.ToString("d.MM"), s,
this.To.ToString("d.MM"));
}
}
Dictionary<string, Item> tbl = new Dictionary<string, Item>();
public void Add(string key, Line line)
{
Item itm;
if (tbl.TryGetValue(key, out itm) == false)
{
itm = new Item { Key = key, From = line.Date, To = line.Date };
tbl.Add(key, itm);
}
itm.From = new DateTime(Math.Min(itm.From.Ticks, line.Date.Ticks));
itm.To = new DateTime(Math.Max(itm.To.Ticks, line.Date.Ticks));
itm.Traffic += line.Traffic;
}
public IEnumerable<Item> Items { get { return tbl.Values; } }
}
class Program
{
static Queue<String> m_workFiles = new Queue<String>();//файлы на обработку
static System.Collections.Generic.List<Stat> m_threadResult; //результат выполнения потока
static bool m_iscomplete = false;//флаг завершения ввода
static readonly object m_locker = new object();//мьютекс для регулирования доступа к очереди файлов на обработку
public void processDirectory(String logDir)//извлечь все файлы очередь для обработки
{
if (!Directory.Exists(logDir))
{
return;
}
lock (m_locker)//захватить мьютекс
{
foreach (var x in Directory.EnumerateFiles(logDir))
{
m_workFiles.Enqueue(x);
}
}
m_iscomplete = true;//установить флаг завершения
}
static void Main(string[] args)
{
var cq = new ConcurrentQueue<Stat>();
var logDir = @"D:\logfiles";
Program pr = new Program();
pr.processDirectory(logDir);
var userstat = new Stat();
Line ln = new Line();
Stat st = new Stat();
foreach (var line in Line.ParseFile(logDir,"log*.txt", 1))
userstat.Add(line.User, line);
//Console.WriteLine(ln.ToCsv(true));
// параллельно ...
Directory.EnumerateFiles(logDir, "log*.txt").AsParallel().ForAll(file =>
{
Console.WriteLine("@" + Environment.CurrentManagedThreadId + "\t" + file);
//var userstat = new Stat();
// собрать статистику из файла
foreach (var line in Line.ParseFile(logDir,file, 1))
userstat.Add(line.User, line);
// сохранить статистику для дальнейшего агрегирования
cq.Enqueue(userstat);
});
Console.WriteLine(cq.Count);
foreach (var si in userstat.Items) Console.WriteLine(si.ToCsv());
Console.WriteLine("Запись файлов-отчётов");
File.WriteAllLines(logDir + "userstat.txt",userstat.Items.Select(si => si.ToCsv()));
File.WriteAllLines(logDir + "adrestat.txt",userstat.Items.Select(si => si.ToCsv1()));
File.WriteAllLines(logDir + "datastat.txt",userstat.Items.Select(si => si.ToCsv2()));
Console.WriteLine("Файлы записаны");
}
}
}public static IEnumerable<Line> Parse(string logDir, string pattern = "log?.txt", int skip = 0)
{
string result = Path.GetFileName(pattern);
foreach (var file in Directory.EnumerateFiles(logDir, result))----Исключение StackOverFlow
{
//foreach (var file in Directory.GetFiles(logDir,result))
// while()
while (File.Exists(pattern))
{
foreach (var line in ParseFile(logDir, file, 1))
yield return line;
}
}
}
public static IEnumerable<Line> ParseFile(string logDir,string file, int skip = 0)
{
return Parse(logDir,file, skip);
}
}Решение задачи: «Исключение при парсинге файлов»
textual
Листинг программы
string logDir = @"D:\logfiles"; ;
var userstat = new Stat();
var cq = new ConcurrentQueue<Stat>();
// параллельно ...
Directory.EnumerateFiles(logDir, "log*.txt").AsParallel().ForAll(file =>
{
Console.WriteLine("@" + Environment.CurrentManagedThreadId + "\t" + file);
// собрать статистику из файла
foreach (var line in Line.ParseFiles(logDir,file, 1))
userstat.Add(line.User, line);
// сохранить статистику для дальнейшего агрегирования
cq.Enqueue(userstat);
});