Haskell:
Odczytywanie pliku tekstowego

How to:

Czytanie pliku tekstowego w Haskellu jest proste. Użyjemy funkcji readFile, którą dostarcza standardowa biblioteka.

main :: IO ()
main = do
    content <- readFile "example.txt"
    putStrLn content

Jeśli plik “example.txt” zawiera tekst “Cześć, Haskell!”, wyjście będzie wyglądać tak:

Cześć, Haskell!

A co jeśli chcesz pracować z każdą linijką osobno? Użyj lines:

main :: IO ()
main = do
    content <- readFile "example.txt"
    let linesOfContent = lines content
    mapM_ putStrLn linesOfContent

Jeżeli “example.txt” ma wiele linii, każda z nich zostanie wypisana osobno.

Deep Dive

Funkcja readFile pojawiła się w Haskellu 98 i od tamtej pory jest standardowym sposobem na odczytywanie plików tekstowych. Jest prosta, ale ma swoje ograniczenia, na przykład nie radzi sobie z dużymi plikami – lepiej wtedy użyć hGetContents i obsługi strumieni.

readFile korzysta z leniwej ewaluacji, co oznacza że zawartość pliku jest wczytywana tylko wtedy, gdy jest potrzebna. Dzięki temu małe pliki są szybko przetwarzane, ale przy dużych plikach to może prowadzić do problemów z wydajnością.

Alternatywą dla readFile jest readFile' z biblioteki strict, która wczytuje cały plik naraz – dobre rozwiązanie dla dużych plików.

A kwestia bezpieczeństwa? Funkcje takie jak withFile automatycznie zamykają plik po zakończeniu pracy, której zakres określamy. Przykład:

import System.IO

main :: IO ()
main = withFile "example.txt" ReadMode (\handle -> do
    content <- hGetContents handle
    putStr content)

Bezpieczniej, bo nie musimy pamiętać o zamykaniu pliku.

See Also