Odczytywanie pliku tekstowego

StreamReader

Jak działa:

StreamReader jest bardziej niskopoziomową klasą, która pozwala na czytanie plików linia po linii lub znak po znaku. Daje większą kontrolę nad tym, jak dane są czytane z pliku, ale wymaga od programisty więcej uwagi, np. zamykania strumienia po zakończeniu.

Zalety:

  • Pozwala na przetwarzanie plików stopniowo, np. linia po linii.
  • Umożliwia pracę z bardzo dużymi plikami, ponieważ nie wczytuje całego pliku naraz do pamięci.
  • Większa elastyczność w czytaniu danych.
using (StreamReader sr = new StreamReader("plik.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null)
    {
        Console.WriteLine(line);
    }
}

W tym przykładzie używamy StreamReader do czytania pliku linia po linii w pętli while. Każda linia jest odczytywana, dopóki nie napotkamy końca pliku (null). using zapewnia, że strumień jest automatycznie zamykany po zakończeniu operacji.

Przykład 1: Dane w jednej linii, rozdzielone średnikami

using (StreamReader sr = new StreamReader("plik.txt"))
{
    string line = sr.ReadToEnd(); // Odczytujemy cały plik naraz
    string[] values = line.Split(';'); // Dzielimy dane na podstawie średników
    
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
}

Przykład 2: Dane w nowej linii, każda linia oddzielona średnikami

using (StreamReader sr = new StreamReader("plik.txt"))
{
    string line;
    while ((line = sr.ReadLine()) != null) // Odczytujemy linia po linii
    {
        string[] values = line.Split(';'); // Dzielimy każdą linię na podstawie średników
        
        foreach (string value in values)
        {
            Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
        }
    }
}

Zastosowanie:

  • Używany, gdy plik jest zbyt duży, aby załadować go w całości do pamięci.
  • Gdy potrzebujesz precyzyjnej kontroli nad przetwarzaniem pliku, np. linia po linii.

ReadAllLines

Jak działa:

File.ReadAllLines odczytuje cały plik i zwraca go jako tablicę ciągów (string[]), gdzie każdy element tablicy to jedna linia z pliku.

Zalety:

  • Jest szybki i prosty do użycia.
  • Działa dobrze dla małych i średnich plików.
  • Wygodne, gdy potrzebujesz od razu wszystkie linie pliku.
string[] lines = File.ReadAllLines("plik.txt");
foreach (string line in lines)
{
    Console.WriteLine(line);
}
  • Wyjaśnienie: ReadAllLines wczytuje cały plik do tablicy lines, a potem każda linia jest wyświetlana w pętli foreach.

Przykład 1: Dane w jednej linii, rozdzielone średnikami

string[] lines = File.ReadAllLines("plik.txt");
if (lines.Length > 0) // Sprawdzamy, czy plik nie jest pusty
{
    string[] values = lines[0].Split(';'); // Dzielimy tylko pierwszą linię na podstawie średników
    
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
}

Przykład 2: Dane w nowej linii, każda linia oddzielona średnikami

string[] lines = File.ReadAllLines("plik.txt");
foreach (string line in lines)
{
    string[] values = line.Split(';'); // Dzielimy każdą linię na podstawie średników
    
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
}

Zastosowanie:

  • Używane, gdy plik jest stosunkowo mały i możesz bezpiecznie załadować cały jego zawartość do pamięci.
  • Idealne do przetwarzania linii jako tablicy w całości.

ReadAllText

Jak działa:

File.ReadAllText odczytuje cały plik i zwraca go jako jeden ciąg tekstowy (string). Oznacza to, że plik jest interpretowany jako ciąg znaków, bez dzielenia na linie.

Zalety:

  • Prostota, gdy potrzebujesz całej zawartości pliku jako pojedynczego ciągu.
  • Użyteczne, gdy chcesz przetworzyć plik w formie całego tekstu, a nie linia po linii.
string text = File.ReadAllText("plik.txt");
Console.WriteLine(text);
  • Wyjaśnienie: ReadAllText odczytuje całą zawartość pliku do pojedynczej zmiennej text, a następnie wypisuje całość tekstu na konsolę.

Przykład 1: Dane w jednej linii, rozdzielone średnikami

string text = File.ReadAllText("plik.txt");
string[] values = text.Split(';'); // Dzielimy dane na podstawie średników

foreach (string value in values)
{
    Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
}

Przykład 2: Dane w nowej linii, każda linia oddzielona średnikami

string text = File.ReadAllText("plik.txt");
string[] lines = text.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries); // Dzielimy po znakach nowej linii

foreach (string line in lines)
{
    string[] values = line.Split(';'); // Dzielimy każdą linię na podstawie średników
    
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
}

Zastosowanie:

  • Używane, gdy plik jest stosunkowo mały i potrzebujesz całą jego zawartość jako jeden ciąg tekstowy.
  • Idealne do odczytywania plików tekstowych, takich jak dokumenty HTML, JSON, czy XML.

3. File.ReadLines

To wersja oszczędniejsza pamięciowo od ReadAllLines. Zamiast wczytywać cały plik do pamięci naraz, ReadLines zwraca enumerator (IEnumerable<string>) i odczytuje plik linia po linii w miarę potrzeby (lazy loading).

foreach (string line in File.ReadLines("plik.txt"))
{
    Console.WriteLine(line);
}

Przykład 1: Dane w jednej linii, rozdzielone średnikami

foreach (string line in File.ReadLines("plik.txt"))
{
    string[] values = line.Split(';'); // Dzielimy linie na podstawie średników
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
    break; // Przerywamy pętlę, ponieważ jest tylko jedna linia
}

Przykład 2: Dane w nowej linii, każda linia oddzielona średnikami

foreach (string line in File.ReadLines("plik.txt"))
{
    string[] values = line.Split(';'); // Dzielimy każdą linię na podstawie średników
    
    foreach (string value in values)
    {
        Console.WriteLine(value.Trim()); // Wyświetlamy każdy element
    }
}

Podsumowanie różnic:

MetodaCo zwracaWczytuje linia po linii?Zalecane dla dużych plików?Komentarz
StreamReaderLinia po linii lub znak po znakuTakTakDaje dużą elastyczność, ale wymaga więcej kodu.
ReadAllLinesTablicę ciągów (string[])Nie, wczytuje całość od razuNieSzybkie i proste do przetwarzania linii tekstu.
File.ReadLinesOdczytuje plik linia po linii (lazy loading).TakTakDuże pliki, przetwarzane linia po linii
ReadAllTextJeden ciąg (string)NieNieOdczytuje cały plik jako pojedynczy ciąg tekstowy.