Haskell:
Работа с CSV
Как:
Чтобы работать с CSV в Haskell, можно использовать библиотеку cassava
. Установите её, добавив cassava
в ваш файл .cabal
или используя Stack. Вот как декодировать и кодировать данные CSV:
{-# LANGUAGE OverloadedStrings #-}
import Data.Csv
import qualified Data.ByteString.Lazy as BL
import qualified Data.Vector as V
-- Предположим, мы работаем с этим типом
type Person = (String, Int, Bool)
-- Пример данных CSV
csvData :: BL.ByteString
csvData = "John Doe,30,true\nJane Smith,25,false"
-- Декодирование данных CSV
decodePeople :: BL.ByteString -> Either String (V.Vector Person)
decodePeople = fmap snd . decode NoHeader
-- Кодирование данных в CSV
encodePeople :: V.Vector Person -> BL.ByteString
encodePeople = encode
-- Пример использования
main :: IO ()
main = do
-- Декодирование
case decodePeople csvData of
Left err -> putStrLn err
Right v -> print v
-- Кодирование
let people = V.fromList [("Alice", 23, True), ("Bob", 35, False)]
BL.putStrLn $ encodePeople people
Пример вывода:
[("John Doe",30,True),("Jane Smith",25,False)]
"Alice",23,True
"Bob",35,False
Глубокое погружение
Обработка CSV в Haskell эволюционировала. Самые ранние методы включали в себя ручной разбор строк, что было подвержено ошибкам. cassava
предлагает типобезопасный парсинг, опираясь на сильную систему типов Haskell. К альтернативам относится пакет csv
, но cassava
более эффективна и гибка. С точки зрения реализации, cassava
использует потоки для эффективности памяти и скорости, что важно при работе с большими наборами данных.
Смотрите также
- Библиотека
cassava
на Hackage: https://hackage.haskell.org/package/cassava - Библиотека Haskell’s ByteString для обработки бинарных данных: https://hackage.haskell.org/package/bytestring
- Руководство по библиотеке Vector, для эффективных списков: https://hackage.haskell.org/package/vector