Исключение при парсинге файлов - C#

Узнай цену своей работы

Формулировка задачи:

Есть программа
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("Файлы записаны");
        }
    }
}
Вроде прописал цикл что пока не закончатся файлы,продолжать работу(файлы прикреплены ниже) Он открыл 2 файла,а остальные 2 он не открыл и выкинул исключение. Мне нужно принять свои файлы и распарсить их,что я делаю не так уже при изъятии пути к каталогу. Я создал отдельную тему так как вопрос другой уже.
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);
            });

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5
Похожие ответы