Haskell |如何将 CSV 文件中的数字列表转换为包含列表的列表

Haskell | How to convert list of numbers in CSV file to a list containing lists

这里 Haskell 不是特别好。刚刚开始使用 I/O 和 Haskell

我有一个 CSV 文件,单列的数字如下:

我有一个函数,它接受文件名并打印出一个列表,其中包含 CSV 类型的每一行的列表:

    printList :: String -> IO ()
    printList nameOfinputFile = do
                                s <- readFile inp
                                ..................
                                ..................
                                ..................
                                print (splitList)

其中 splitList 是预期的输出,对于给定的 CSV 文件示例,它看起来像:

[ [1,2,3],[4,5],[6,7,8,9],[10],[11,12,13,14,15],[16],[17] ]

如何在保留函数类型的同时实现它?

这适用于 Replit:

import Data.List(lines)
import Distribution.Simple.Utils(unintersperse)

splitList :: String -> [[Int]]
splitList = map (map read . unintersperse ',') . lines

做同样的事情可能有很多种方法。这是我的版本:

import Data.List.Split

convList [] = []
convList [""] = []
convList xs = map (\x -> read x :: Int) xs

main = do
    content <- readFile "Test.csv"
    let valuesStr = map (splitOn ",") $ lines content
    let valuesInt = map convList valuesStr

    print valuesInt

main 函数使用 readFile 读取 CSV 文件。函数 lines 用于拆分内容,然后 splitOn 映射到行上。最后,一个新函数 convList 映射到每个列表中的值。函数convList有三种可能:

  • 空列表,生成一个空列表
  • 空行,产生一个空列表
  • 元素存在,产生值(这里是 Int,可以是 Double)

带有额外空行的结果:

[[1,2,3],[4,5],[6,7,8,9],[10],[11,12,13,14,15],[16],[17],[]]