簡體   English   中英

從包含點的文件中讀取

[英]Reading from file which contain dots

我有包含兩個數字的txt文件,例如:

2。

3。

您怎么看,每行的結尾都是點。

如何閱讀並打印此數字的總和?

如果我的文件不包含點,那么例如

2

3

沒問題 我的代碼是:

main3 = do
    x <- openFile "C:/Users/file.txt"  ReadMode
    m <- hGetLine x
    n <- hGetLine x
    return ((read m::Int)+(read n::Int))

而且效果很好。 但是當文件中有點時,我不知道該怎么辦。 也許有圖書館?

感謝幫助。

麻煩的是, read將無法解析"3." 3 如果您只是想以駭人聽聞的方式執行此操作,則可以刪除最后一個字符。

main4 = do
    x <- openFile "C:/Users/file.txt"  ReadMode
    m <- hGetLine x
    n <- hGetLine x
    return ((read (init m)::Int)+(read (init n)::Int))

這可能有效,但非常脆弱,因為它假定每行中唯一的非數字字符是最后一個字符。 我們可以假設數字的前n數字做得更好

import Data.Char

-- takeWhile isDigit :: String -> String

main5 path = do
  f <- readFile path
  numberStrings <- map (takeWhile isDigit) (lines f)
  sum (map read numberStrings)

最可靠的解決方案是升級到像Parsec這樣的“解析器組合器庫”,它可以讓您寫出文本文件的語法。

有幾種方法可以做到。

main = do
  text <- readFile "file.txt" -- Grab the file
  let nums = map read . map init . lines $ text
  print $ sum nums

init只是丟棄了. 但是我會這樣寫

import Text.Parsec.String
import Text.Parsec
import Control.Applicative ((<*), (<$>))

getNums :: Parser [Int]
getNums = num `sepEndBy` newline
    where num = read <$> many1 digit <* char '.'

main = parseFromFile getNums "filename" >>= print . fmap sum

像這樣使用parsec是否值得? 答案是“取決於”。 我的經驗法則是,如果我打算多次使用它,那就硬着頭皮使用parsec。 修改使用諸如parsec之類的庫的東西來修改新的和更復雜的格式要容易得多。 另外,您可以通過這種方式獲得免費的[體面]錯誤消息。

您可以通過利用Haskell的monadic API來完成以下步驟:

  1. 逐行讀入文件行
  2. 檢查每行是否以點結尾:使用map並返回Maybe monad:當行不以點結尾時為空,當行以點結束時為Just(不帶點的值)
  3. 再次使用Maybe monad,使用map + flatten將每個String轉換為數字。 出現錯誤時不顯示任何內容,或者僅x包含數字
  4. 使用折疊求和

有空的時候,我將嘗試建立一個例子。 玩Haskell的monadic API總是很有趣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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