Исключение при парсинге файлов - 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); });
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д