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: