[英]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來完成以下步驟:
有空的時候,我將嘗試建立一個例子。 玩Haskell的monadic API總是很有趣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.