簡體   English   中英

木薯跳過或忽略列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM