5

CSV ファイルを操作するための優れた Haskell パッケージとしてcsv-conduitが提案されました。それがどのように機能するかを知りたいのですが、初心者の Haskell プログラマーにはドキュメントが簡潔すぎます。

GHCi で試行錯誤してどのように動作するかを理解する方法はありますか?

より具体的には、 GHCiからモジュールとファイルをロードする必要がありますか、それとも単純な HS ファイルを作成してそれらをロードし、対話的移動する必要がありますか?


csv-conduit について言及しましたが、どのCSV パッケージも使用できます。1 つ手に入れて、気が楽になるまで (IDLE で行うのと同じように) いじる必要があります。

4

3 に答える 3

5

次の関数を見てください。readCSVFile :: :: (MonadResource m, CSV ByteString a) => CSVSettings -> FilePath -> m [a]

、および(別名)CSVSettingsなどの が必要なだけなので、呼び出すのは比較的簡単です。defCSVSettingsFilePathString"file.csv"

したがって、呼び出しの後、 が得られ(MonadResource m, CSV ByteString a)ます。これを 1 つずつ解決して、これに適した型を見つけます。IOこの操作を実行しているので、 forMonadResource mは でmある必要がありResourceT IO、これはたまたまMonadBaseControl IOによって必要とされる のインスタンスになりますrunResourceT。これはconduit具体的なことです。

についてはCSV ByteString a、 のどのインスタンスを見つける必要がありますCSV。これを行うには、http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV (パッケージのドキュメント私の意見では、やや不愉快なことに、すべてが型クラスに詰め込まれています...)そしてインスタンスをクリックして、フォームの使用可能なインスタンスを確認しますCSV ByteString a。との 2 つのオプションがCSV ByteString ByteStringありCSV ByteString Textます。

これらの 2 つのうち、TextUnicode を処理し、CSV にバイナリ データが含まれる可能性が低いため、推奨されます。ByteString多かれ少なかれ a [Word8]whileに似ていTextます より似て[Char]いる どちらがおそらくあなたが望むものです. したがって、(まだ動作しますが)するa必要があります。TextByteString

これは、関数呼び出しの結果が であることを意味しますResourceT IO [Row Text]。これでは多くのことはできませんが、ResourceTはモナド変換子であるため、関数 を使用してモナド変換レイヤーから簡単に「ポップ」できますrunResourceT。したがって、

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

これは、たとえば main 内で簡単に使用でき、次に aまたは a[Row Text]で反復して個々の行を取得できます。mapfold

この種のものを GHCI で実行するには、型を明確に指定する必要があります。その理由は、結果クラスのインスタンスがどのパラメーターにも依存していないためです。したがって、 と の任意のセットについてCSVSettings、それらが のインスタンスでありのインスタンスである限り、任意の数の異なる型を返すことがFilePathできます。したがって、必要な型を GHCi に明示的に指定する必要があります。readCSVFilemMonadResource maCSV ByteString a

于 2012-07-19T00:04:21.037 に答える
2

Text.CSVを試しましたか? Haskell を使い始めたばかりの場合は、はるかに単純なので、より適切かもしれません。新しいモジュールの探索に関しては、それを GHCi にロードするだけでよく、追加のファイルを書く必要はありません。

于 2012-07-18T20:08:20.230 に答える
0

これは csv-conduit パッケージの最新バージョン (バージョン 0.6.3) で動作します。これがないとコンパイルできなかった readCsv の署名に注意してください。

{-# 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" ';'
于 2014-11-26T00:46:57.967 に答える