Aplikacja konsolowa, jak sumować wartości plików?

0

Siema, piszę program który tworzy i odczytuje proste pliki tekstowe które mają szkielet np.:

name:	C
price:	86$
qty:	8
sum:	688$

problem zaczyna się w linii 108, chcę stworzyć plik który będzie sumował mi wartość "sum" z plików, kiedy będą miały taką samą nazwę, np. dla pliku powyższego i poniższego:

name:	C
price:	10$
qty:	1
sum:	10$

stworzy mi taki:

name:	C
sum:	698$

nie wiem jak to napisać, może użyć Listy z tablicami, albo klasy.

Nie chciałem wyodrębniać kodu, więc wrzucam całość, jeśli macie jakieś uwagi co do reszty kodu to również śmiało.
Proszę bardzo o wyrozumiałość, to mój pierwszy większy program jakikolwiek napisałem.

using System;
using System.IO;
using System.Text;

namespace FileManager
{
    class Program
    {
        static void Main()
        {
            // path to folder with files
            string directoryPath = @"C:\...";

            while (true)
            {
                var fileList = Directory.GetFiles(directoryPath);
                // show files in console
                int directoryPathLength = directoryPath.Length + 1;
                var fileNumber = 0;
                Console.Write("Files in directory: ");
                foreach (var fileName in fileList)
                {
                    Console.Write(fileName.Substring(directoryPathLength) + ", ");
                    fileNumber += 1;
                }
                Console.WriteLine($"\r\n\r\nTotal files: {fileNumber}");

                // menu
                Console.WriteLine("\n\r1. Delete all files in directory");
                //Console.WriteLine("2. Delete 1 file");
                Console.WriteLine("3. Generate new random file");
                Console.WriteLine("4. Create new file");
                Console.WriteLine("5. Open and show files");
                //Console.WriteLine("6. Sum all files and create \"sum.txt\" file");
                Console.WriteLine("0. Exit");

                // menu control
                ConsoleKeyInfo choice = Console.ReadKey(true);
                var switchChoice = choice.Key.ToString();
                switch (switchChoice)
                {
                    case "D1":
                        // deleting all files in directoryPath
                        fileList = Directory.GetFiles(directoryPath);
                        foreach (var path in fileList)
                        {
                            File.Delete(path);
                        }
                        Console.Clear();
                        break;
                    case "D3":
                        // creating new random files
                        FileStream fsRandom = File.Create(NextFilePath(directoryPath));
                        Random rnd = new Random();
                        var randomNames = new string[]
                        {
                         "A","B","C","D","E"
                        };
                        int index = rnd.Next(randomNames.Length);
                        string name = randomNames[index];
                        int price = rnd.Next(1, 101);
                        int quantity = rnd.Next(1, 11);
                        CreateFile(fsRandom, name, price, quantity);
                        fsRandom.Close();
                        Console.Clear();
                        break;
                    case "D4":
                        // creating a new file (user input)
                        Console.Clear();
                        FileStream fsUserInput = File.Create(NextFilePath(directoryPath));
                        Console.WriteLine($"== {fsUserInput.Name.Substring(directoryPathLength)} ======");
                        Console.Write("name [A-E]: ");
                        name = Console.ReadLine();
                        Console.Write("price [$]: ");
                        price = int.Parse(Console.ReadLine());
                        Console.Write("qty: ");
                        quantity = int.Parse(Console.ReadLine());
                        Console.Write($"sum: {price * quantity}$");
                        CreateFile(fsUserInput, name, price, quantity);
                        fsUserInput.Close();
                        Console.Write("\n\r\n\rFile created");
                        Console.Write("\n\rPress any key to continue.. ");
                        Console.ReadKey();
                        Console.Clear();
                        break;
                    case "D5":
                        // reading files
                        Console.Clear();
                        fileList = Directory.GetFiles(directoryPath);
                        fileNumber = 0;
                        foreach (var path in fileList)
                        {
                            Console.WriteLine($"== {path.Substring(directoryPathLength)} ======");
                            StreamReader sr = new StreamReader(path);
                            Console.WriteLine(sr.ReadToEnd());
                            Console.WriteLine();
                            fileNumber++;
                            sr.Close();
                        }
                        Console.WriteLine("===================");
                        Console.WriteLine($"Total files: {fileNumber}");
                        Console.WriteLine("===================");
                        Console.Write("\n\rPress any key to continue.. ");
                        Console.ReadKey();
                        Console.Clear();
                        break;
                    case "D6":
                        // sum of all files                                                       zapisuj nazwy w tablicy/liście? Może obiekty nowej klasy? Potem sumuj
                        FileStream fsSum = File.Create(NextFilePath(directoryPath));


                        fsSum.Close();
                        break;
                    case "D0":
                        // exit
                        Environment.Exit(0);
                        break;
                    default:
                        Console.Clear();
                        break;
                }
            }
        }

        /// <summary>
        /// Returns next file path in directory (ex. "...\file2.txt", because "...\file1.txt" exists)
        /// </summary>
        /// <param name="directoryPath">path to a directory, files will be created here</param>
        /// <returns></returns>
        private static string NextFilePath(string directoryPath)
        {
            var fileList = Directory.GetFiles(directoryPath);
            var fileNumber = 1;
            foreach (var fileName in fileList)
                fileNumber++;
            return @$"{directoryPath}\file{fileNumber}.txt";
        }

        /// <summary>
        /// Creates a new .txt file
        /// </summary>
        /// <param name="fs">fs = File.Create(path)</param>
        /// <param name="name">name</param>
        /// <param name="price">price</param>
        /// <param name="quantity">quantity</param>
        private static void CreateFile(FileStream fs, string name, int price, int quantity)
        {
            AddText(fs, $"name:\t{name}");
            AddText(fs, $"\r\nprice:\t{price}$");
            AddText(fs, $"\r\nqty:\t{quantity}");
            AddText(fs, $"\r\nsum:\t{price * quantity}$");
        }

        private static void AddText(FileStream fs, string text)
        {
            byte[] info = new UTF8Encoding(true).GetBytes(text);
            fs.Write(info, 0, info.Length);
        }
    }
}
0

Wyglada prosto, wczytać pliki do struktury (zrobiłbym podobną do "szkieletu" pliku), wyszukać elementy o tej samej nazwie i zsumowac po polu price, (tam nad sumą trzeba trochę popracować, bo nie są to liczby tylko stringi z dollarem na końcu); tworzymy strukturę, metody, etc... A tu wszystko wewalone do maina i jeszcze menu, tworzenie losowych plików, usuwanie plików w katalogu? Napisałbym to od nowa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1