2012-07-18 28 views
5

Tôi đã được đề xuất csv-conduit làm gói Haskell tốt để làm việc với tệp CSV. Tôi muốn tìm hiểu cách nó hoạt động, nhưng tài liệu là quá ngắn gọn cho một lập trình viên mới của Haskell.Haskell csv-conduit trong GHCi

Có cách nào để tôi tìm hiểu cách thức hoạt động của bản dùng thử và lỗi trong GHCi không?

Cụ thể hơn, tôi nên tải các module và các tập tin từ GHCi hay tôi nên viết một tập tin HS đơn giản để tải chúng và sau đó di chuyển xung quanh một cách tương tác?


tôi đã đề cập csv-ống dẫn, nhưng tôi đang mở để sử dụng bất kỳ gói CSV. Tôi chỉ cần nắm tay tôi và đánh lừa nó, cho đến khi tôi cảm thấy thoải mái (giống như tôi sẽ làm trong IDLE).

Trả lời

2

Bạn đã thử Text.CSV chưa? Nó có thể phù hợp hơn nếu bạn mới bắt đầu với Haskell, vì nó đơn giản hơn nhiều. Để khám phá các mô-đun mới, bạn chỉ có thể tải nó vào GHCi, không cần phải viết thêm một tệp.

5

Hãy nhìn vào các chức năng sau đây: readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]

của nó tương đối đơn giản để gọi, như chúng ta chỉ cần một CSVSettings, chẳng hạn như defCSVSettings, và một FilePath (aka String), "file.csv" hay một cái gì đó.

Do đó, sau cuộc gọi, chúng tôi nhận được (MonadResource m, CSV ByteString a). Chúng ta có thể giải quyết vấn đề này tại một thời điểm để tìm ra một loại thích hợp cho việc này. Chúng tôi đang thực hiện IO trong thao tác này, vì vậy đối với MonadResource m, m chỉ nên là ResourceT IO, xảy ra là một phiên bản của MonadBaseControl IO theo yêu cầu của runResourceT. Đây là một điều đặc biệt là conduit.

Đối với CSV ByteString a, chúng tôi cần tìm các phiên bản của CSV. Để làm như vậy, hãy truy cập http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV (trong đó tài liệu dành cho gói theo ý kiến ​​của tôi có phần hơi đáng ghét khi được nhồi vào hộp đánh chữ ...) và nhấp vào Trường hợp để xem các trường hợp có sẵn của chúng tôi có dạng CSV ByteString a. Hai tùy chọn là CSV ByteString ByteStringCSV ByteString Text.

Trong số hai trường hợp này, Text thích hợp hơn vì nó xử lý unicode và CSV không có khả năng chứa dữ liệu nhị phân. ByteString ít nhiều giống với [Word8] trong khi Text tương tự với [Char], đó có thể là những gì bạn muốn. Do đó, a phải là Text (mặc dù ByteString sẽ vẫn hoạt động).

Điều này có nghĩa là kết quả của cuộc gọi hàm là ResourceT IO [Row Text]. Chúng tôi không thể làm gì nhiều với điều này, nhưng vì ResourceT là một biến thể đơn nguyên, chúng tôi có thể dễ dàng "bật" ra khỏi lớp chuyển đổi đơn nguyên với hàm runResourceT. Như vậy,

readFile :: FilePath -> IO [Row Text] 
readFile = runResourceT . readCSVFile defCSVSettings 

mà có thể dễ dàng sử dụng được trong vòng, nói rằng, chính để có được tại [Row Text] mà sau đó bạn có thể lặp lại với một map hoặc một fold để có được bàn tay của bạn trên hàng riêng lẻ.

Để chạy loại điều này trong GHCI, bạn hoàn toàn phải chỉ ra loại đó. Lý do là cá thể lớp kết quả không phụ thuộc vào bất kỳ tham số nào; do đó, đối với bất kỳ bộ nào của CSVSettingsFilePath, readCSVFile có thể trả lại bất kỳ số nào các loại khác nhau miễn là chúng là m là một phiên bản MonadResource ma là một phiên bản CSV ByteString a. Vì vậy, chúng tôi phải chỉ rõ GHCi là loại bạn muốn.

0

Điều này làm việc với phiên bản mới nhất của gói csv-conduit (phiên bản 0.6.3). Lưu ý chữ ký của readCsv mà không có mà tôi không thể biên dịch.

{-# LANGUAGE OverloadedStrings #-} 

import Data.CSV.Conduit 
import Data.Text (Text) 
import qualified Data.Vector as V 
import qualified Data.ByteString as B 

csvset :: Char -> CSVSettings 
csvset c = CSVSettings {csvSep = c, csvQuoteChar = Just '"'} 

readCsv :: String -> Char -> IO (V.Vector (Row Text)) 
readCsv fp del = readCSVFile (csvset del) fp 

main = readCsv "C:\\mydir\\myfile.csv" ';' 
+0

với gói csv-ống dẫn-0.6.6 readCsv chữ ký nên được 'readCsv :: String -> Char -> IO (V.Vector (Row B.ByteString))', thay thế Row Text with Row B. ByteString – Janthelme

Các vấn đề liên quan