因此,对于简单的用例,我对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作为处理超宽文档的一种解决方法])
答案 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