Подтвердить что ты не робот

Полнофункциональный анализатор CSV для Haskell?

Может кто-нибудь рекомендовать способ разбора CSV файлов с параметрами:

  • установить разделители ячеек/полей
  • установить конец терминатора записи/строки
  • set quote-character для полей
  • поддержка строк UTF-8
  • возможность записи в CSV-структуру в памяти обратно в файл

Я попробовал Text.CSV, но это очень просто и не хватает большинства вышеперечисленных функций. Есть ли еще более продвинутый модуль синтаксического анализа CSV или мне нужно написать его "с нуля", то есть с помощью Text.ParserCombinators? Я не собираюсь изобретать колесо.

Позаботьтесь.

4b9b3361

Ответ 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"