木薯跳过或忽略列

时间:2019-04-22 20:18:04

标签: csv haskell

因此,对于简单的用例,我对Cassava有了很好的了解,但是我有一个具有25列的.csv,我只关心第二和第五列。有什么方法可以对每一行进行部分解析,还是需要在labmda声明中进行20个_ :: Text参数声明?

Right v -> V.forM_ v $ \ (_ :: Text, thingA :: Text, _ :: Text,  _ :: Text,  _ :: Text, thingB :: Text,,  _ :: Text,  _ :: Text,  _ :: Text ..... etc

编辑:还发现无论如何都没有25列CSV的实例,因此即使我可笑的336个字符签名也无法工作。

编辑':似乎一个解决方案可能被称为记录(建议使用here作为处理超宽文档的一种解决方法])

2 个答案:

答案 0 :(得分:1)

您可以为此编写自己的FromRecord实例。您只需要编写一个parseRecord方法,该方法采用Record(类型为Vector Field),在索引1和4处提取所需的列,并将它们加载到您的数据类型中。 / p>

类似以下的方法将起作用:

{-# LANGUAGE OverloadedStrings #-}

import Data.Csv
import qualified Data.Vector as V
import Data.Text (Text)

data SomeFields = SomeFields Text Text deriving (Show)
instance FromRecord SomeFields where
  parseRecord r = SomeFields <$> parseField (r V.! 1) <*> parseField (r V.! 4)

main = do
  print $ (decode NoHeader "1,2,3,4,5,6,7\na,b,c,d,e,f,g\n"
           :: Either String (V.Vector SomeFields))

答案 1 :(得分:0)

最终以这种方式解决了。

I/O operation on closed file