【问题标题】:Haskell :: Parsing Line of Text into a List of ListHaskell :: 将文本行解析为列表列表
【发布时间】:2017-12-04 09:15:48
【问题描述】:

大家好,

我正在解析一个如下所示的文本文件:

114.474998474121 15.7440004348755 25.806999206543 -873 172 182 188 
114.46199798584 15.7419996261597 25.8799991607666 -1396 180 192 205 

希望它可以这样读:

[[114.475,15.744,25.807,-873.0,172.0,182.0,188.0],
[114.462,15.742,25.88,-1396.0,180.0,192.0,205.0]]

目前我的文本解析代码没有提供。这是我的代码:

main = do
    text <- readFile "mytext.txt" 
    let
        pcVal = map read (words text) :: [Float]
    print pcVal
    return ()

此代码将所有文本解析为单个列表,如下所示:

[114.475,15.744,25.807,-873.0,172.0,182.0,188.0,
114.462,15.742,25.88,-1396.0,180.0,192.0,205.0]

我找不到如何将整个单行(在文本文件中)作为一个列表,并将第二行作为另一个列表,直到文件末尾。感谢有人有这方面的经验。谢谢。

【问题讨论】:

  • 我假设你是一个初学者 - 当你知道更多haskell时,给未来一个提示;重新审视这个练习并实现一个解析器,而不是仅仅拥有一个双值列表。
  • 是的@epsilonhalbe,我是初学者,开始喜欢这种语言。我会听取你对未来的建议。谢谢!

标签: list haskell text-parsing


【解决方案1】:

你可以使用lines函数;例如map words $ lines text

这也是一个辅助函数的好时机,即

let parse :: String -> [Float]
    parse line = map read $ words line
    pcVal = map parse $ lines text

【讨论】:

  • 感谢@Dan,我已经尝试过,但 String - Char 中的一些错误。稍微编辑一下就可以了!我在下面发布答案。
  • @SirDK 我认为我添加的类型注释应该会有所帮助。
【解决方案2】:

感谢 Dan 建议将线条作为解决方案。这是适用于我的问题的代码:

main = do
    text <- readFile "mytext.txt" 
    let
        readparse txtLines = map read txtLines :: [Float]
        parse txtLines = map (words) (lines txtLines)
        pcval = map readparse (parse text) 
    print pcVal
    return ()

希望它也对其他人有所帮助。谢谢和欢呼!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多