Console .NET Framework alkalmazás — forráskód

A következő C# kód egy egyszerű konzolalkalmazás (.NET Framework 4.7.2 vagy hasonló) amely beolvassa az income.csv és expense.csv fájlokat, deserializálja őket közös Transaction osztályba, és kiír néhány példasort. A kód feltételezi, hogy a CSV fájlok fejlécet tartalmaznak: date,amount,source (illetve date,amount,destination). Hibakezelés alapvető.

Program.cs

using System; using System.Collections.Generic; using System.Globalization; using System.IO; namespace CsvToTransactions { enum TransactionType { Income, Expense } class Transaction { public int ID { get; set; } public DateTime Date { get; set; } public TransactionType TransactionType { get; set; } public decimal Amount { get; set; } public string Description { get; set; } } class Program { static void Main(string[] args) { try { var incomePath = "income.csv"; var expensePath = "expense.csv"; var transactions = new List<Transaction>(); // Beolvasás transactions.AddRange(ReadTransactionsFromCsv(incomePath, TransactionType.Income)); transactions.AddRange(ReadTransactionsFromCsv(expensePath, TransactionType.Expense)); // ID autoincrement int id = 1; foreach (var t in transactions) { t.ID = id++; } // Példa: kiírás Console.WriteLine("ID\tDate\t\tType\tAmount\tDescription"); foreach (var t in transactions) { Console.WriteLine($"{t.ID}\t{t.Date:yyyy-MM-dd}\t{t.TransactionType}\t{t.Amount}\t{t.Description}"); } } catch (Exception ex) { Console.WriteLine("Hiba: " + ex.Message); } Console.WriteLine("Kész. Nyomj Entert a kilépéshez."); Console.ReadLine(); } static IEnumerable<Transaction> ReadTransactionsFromCsv(string path, TransactionType type) { var list = new List<Transaction>(); if (!File.Exists(path)) return list; using (var sr = new StreamReader(path)) { string header = sr.ReadLine(); // feltételezzük, hogy van fejléc string line; while ((line = sr.ReadLine()) != null) { if (string.IsNullOrWhiteSpace(line)) continue; // Egyszerű CSV feldolgozás feltételezett formátummal: nincs beágyazott separator a mezőkben var parts = line.Split(','); if (parts.Length < 3) continue; // date, amount, source/destination DateTime date; decimal amount; var dateStr = parts[0].Trim(); var amountStr = parts[1].Trim(); // a lehetséges leírás mező az összes maradék összefűzésével (ha a description tartalmazhatott vesszőt) var desc = string.Join(",", parts, 2, parts.Length - 2).Trim(); // próbáljuk több formátummal parse-olni if (!DateTime.TryParseExact(dateStr, new[] { "yyyy-MM-dd", "yyyy/MM/dd", "MM/dd/yyyy", "dd.MM.yyyy", "yyyy-M-d" }, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) { // próbáljunk általános Parse-t if (!DateTime.TryParse(dateStr, out date)) continue; // érvénytelen dátum -> kihagyjuk a sort } if (!decimal.TryParse(amountStr, NumberStyles.Any, CultureInfo.InvariantCulture, out amount)) { // próbáljuk helyi formátummal if (!decimal.TryParse(amountStr, NumberStyles.Any, CultureInfo.CurrentCulture, out amount)) continue; // érvénytelen összeg -> kihagyjuk } list.Add(new Transaction { Date = date, TransactionType = type, Amount = amount, Description = desc }); } } return list; } } }

Megjegyzések: