Полнофункциональный анализатор CSV для Haskell?
Может кто-нибудь рекомендовать способ разбора CSV файлов с параметрами:
- установить разделители ячеек/полей
- установить конец терминатора записи/строки
- set quote-character для полей
- поддержка строк UTF-8
- возможность записи в CSV-структуру в памяти обратно в файл
Я попробовал Text.CSV, но это очень просто и не хватает большинства вышеперечисленных функций.
Есть ли еще более продвинутый модуль синтаксического анализа CSV или мне нужно написать его "с нуля", то есть с помощью Text.ParserCombinators? Я не собираюсь изобретать колесо.
Позаботьтесь.
Ответы
Ответ 1
Я не могу рекомендовать готовый, упакованный CSV-парсер для Haskell, но я помню, что книга Real-World Haskell by Bryan O'Sullivan и др. содержит главу Parsec, которую авторы демонстрируют, создавая CSV синтаксический анализатор.
Соответствующая глава 16: Использование Parsec доступна в Интернете; проверьте раздел "Расширенный пример: полный CSV-анализатор".
Ответ 2
Это старый поток, но csv-conduit и cassava имеют большинство, если не все - не уверены в повторной записи в файл - функций, которые вы ищете.
Ответ 3
Быстрый поиск по Hackage находит Data.Spreadsheet, который имеет настраиваемую цитату и разделитель.
Ответ 4
В hackage есть Data.Csv
module. Если ваш дистрибутив не предоставляет пакет для него, вы можете установить его через cabal, например.
$ cabal install cassava
Он может читать и записывать (то есть декодировать/кодировать) записи из/в файлы CSV.
Вы можете установить разделитель полей следующим образом:
import Data.Csv
import Data.Char -- ord
import qualified Data.ByteString.Lazy.Char8 as B
enc_opts = defaultEncodeOptions {
encDelimiter = fromIntegral $ ord '\t'
}
write_csv vector = do
B.putStr $ encodeWith enc_opts vector
В настоящее время Data.Csv
не предлагает другие параметры кодирования/декодирования. Существуют варианты функций для работы со строкой заголовка. Как и в случае, строки заканчиваются CRLF, для цитирования используются двойные кавычки и как предполагается кодирование текста UTF8. Двойные кавычки в значениях цитируются с обратной косой чертой, а цитирование опущено там, где оно "не обязательно".
Ответ 5
Кассава работает в памяти и представляет собой очень простую библиотеку, например.
encode [("John" :: Text, 27), ("Jane", 28)]
"John,27\r\nJane,28\r\n"