[英]Cassava Skip or Ignore Columns
所以我對簡單用例的 Cassava 有一個很好的掌握,但我有一個 .csv 有 25 列,我只關心第 2 和第 5 列。 有沒有辦法對每一行進行部分解析,或者我是否需要在如下所示的 labmda 聲明中進行 20 _ :: Text
參數聲明?
Right v -> V.forM_ v $ \ (_ :: Text, thingA :: Text, _ :: Text, _ :: Text, _ :: Text, thingB :: Text,, _ :: Text, _ :: Text, _ :: Text ..... etc
編輯:還剛剛發現無論如何都沒有 25 列 CSV 的實例,所以即使是我荒謬的 336 個字符簽名也無法工作。
編輯':似乎一種解決方案可能是命名記錄( 此處建議作為處理超寬文檔的修復程序)
您可以FromRecord
編寫自己的FromRecord
實例。 您只需要編寫一個parseRecord
方法,它接受一個Record
(它是Vector Field
類型),在索引 1 和 4 處提取所需的列,並將它們加載到您的數據類型中。
類似以下內容將起作用:
{-# 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))
最終以這種方式解決了它。
data ThingAtoThinBMapping = ThingAtoThinBMapping {
thingA :: Text
, thingB :: Text
} deriving (Eq, Show, Read)
instance FromNamedRecord ThingAtoThinBMapping where
parseNamedRecord r = ThingAtoThinBMapping
<$> r .: "thing_a"
<*> r .: "thing_b"
printABMap = do
csvData <- BL.readFile "reallywide.csv"
case decodeByNameWith decodeOpts csvData of
Left err -> putStrLn err
Right (h, v) -> do
putStrLn $ show h
V.forM_ v $ \ m ->
putStrLn $ show (thingA m, thingB m)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.