2011-01-23 15 views
16

¿Alguien puede recomendar una manera de analizar los archivos CSV con opciones para:Analizador de CSV completo para Haskell?

  • celdas de conjunto/campos separador
  • final conjunto de grabación/terminador de fila
  • conjunto cita de caracteres para campos
  • apoyo de UTF-8 cuerdas
  • capacidad de escribir estructura CSV en memoria de vuelta a un archivo

yo probé texto .CSV pero es muy simple y carece de la mayoría de las características anteriores. ¿Hay algún módulo de análisis de CSV más avanzado o tengo que escribirlo "desde cero", es decir, utilizando Text.ParserCombinators? No pretendo reinventar una rueda.

Ten cuidado.

Respuesta

4

Una búsqueda rápida en Hackage encuentra Data.Spreadsheet, que tiene citas y separadores personalizables.

+0

creo que todavía hay una falta de buena biblioteca csv: 'spreadsheet' utiliza cuerdas y' csv-bytestring' no permite especificar el separador –

6

Este es un hilo antiguo, pero tanto csv-conduit como cassava tienen la mayoría, si no todas, no están seguras de volver a escribir en el archivo de las características que está buscando.

3

Existe el Data.Csv module en hackage. En caso de que su distribución no le proporcione un paquete, puede instalarlo a través de cabal, p.

$ cabal install cassava 

Puede leer y escribir (es decir, descodificar/codificar) registros de/a archivos CSV.

puede establecer el separador de campo así:

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 

Actualmente, Data.Csv no ofrece otras opciones de codificación/decodificación. Hay variantes de funciones para trabajar con una fila de encabezado. Como es, las líneas se terminan con CRLF, las comillas dobles se utilizan para cotizar y se supone que se utiliza la codificación de texto UTF8. Las comillas dobles en los valores se citan con una barra diagonal inversa y las comillas se omiten cuando "no es necesario".

-1

Cassava funciona en la memoria y es una biblioteca muy simple, p.

encode [("John" :: Text, 27), ("Jane", 28)] 
"John,27\r\nJane,28\r\n"