Kihagyás

Fájlkezelés

A System.IO.File osztály egyszerű szövegfájlok írására és olvasására használható. A Python with open(...) szerkezete mögött is hasonló erőforrás-kezelés áll. A példákban a relatív útvonal a program aktuális munkakönyvtárához viszonyul.

Fájl írása

using System.IO;

File.WriteAllText("uzenet.txt", "Első sor\n"); // felülírja a fájlt
File.AppendAllText("uzenet.txt", "Második sor\n");
with open("uzenet.txt", "w", encoding="utf-8") as fajl:
    fajl.write("Első sor\n")
with open("uzenet.txt", "a", encoding="utf-8") as fajl:
    fajl.write("Második sor\n")

Lista kiírása fájlba

List<string> nevek = new() { "Anna", "Béla", "Csilla" };
File.WriteAllLines("nevek.txt", nevek);

WriteAllLines minden elem után sortörést ír. Nagy fájlhoz a StreamWriter előnyös, mert soronként írhatunk:

using StreamWriter iro = new("nevek.txt");
foreach (string nev in nevek)
{
    iro.WriteLine(nev);
}

A using gondoskodik az író lezárásáról akkor is, ha hiba történik.

Fájl olvasása

if (File.Exists("nevek.txt"))
{
    string teljesTartalom = File.ReadAllText("nevek.txt");
    string[] sorok = File.ReadAllLines("nevek.txt");
    Console.WriteLine($"{sorok.Length} sor: {teljesTartalom}");
}

A ReadAllLines az egész fájlt memóriába tölti. Nagy fájlhoz a File.ReadLines soronkénti bejárása alkalmas:

foreach (string sor in File.ReadLines("nevek.txt"))
{
    Console.WriteLine(sor);
}

Fájlinformációk és hibák

FileInfo info = new("nevek.txt");
if (info.Exists)
{
    Console.WriteLine($"Méret: {info.Length} bájt");
    Console.WriteLine($"Teljes út: {info.FullName}");
}

Egy fájl a létezés ellenőrzése után is eltűnhet, vagy nem olvasható jogosultság miatt. A kivételeket ott kezeljük, ahol érdemben tudunk reagálni:

try
{
    string szoveg = File.ReadAllText("nevek.txt");
    Console.WriteLine(szoveg);
}
catch (FileNotFoundException)
{
    Console.WriteLine("A fájl nem található.");
}
catch (UnauthorizedAccessException)
{
    Console.WriteLine("Nincs jogosultság a fájl olvasásához.");
}

CSV beolvasása

Egyszerű, idézőjelet és pontosvesszőt nem tartalmazó gyakorlóadat esetén a Split(';') elegendő:

diakok.csv
nev;kor
Anna;17
Béla;18
foreach (string sor in File.ReadLines("diakok.csv").Skip(1))
{
    string[] oszlopok = sor.Split(';');
    if (oszlopok.Length != 2 || !int.TryParse(oszlopok[1], out int kor))
    {
        Console.WriteLine($"Hibás sor: {sor}");
        continue;
    }

    Console.WriteLine($"{oszlopok[0]}: {kor} éves");
}

A Skip(1) átugorja a fejlécet (System.Linq szükséges, amit a modern .NET konzolprojekt általában automatikusan importál). Valódi CSV-ben idézőjelek, sortörések és elválasztójelek is lehetnek az adatokon belül; ahhoz CSV-feldolgozó könyvtárat használjunk.

Feladatok

  1. Írj öt nevet egy fájlba, majd olvasd vissza listába és írd ki őket!
  2. Olvass be egy név;pontszám formátumú gyakorló CSV-t! Csak az érvényes sorokat dolgozd fel, és számítsd ki az átlagot.