Чтение чего-либо из файла и помещение его под тип данных - PullRequest
1 голос
/ 12 ноября 2010

У меня есть файл, который содержит это:

(Float,Float,Float)"sometext"
(Float,Float,Float)"sometext"
(Float,Float,Float)"sometext"
...
...

и я хотел бы, чтобы моя программа считала строку из файла, поместила (Float, Float, Float) в тройку и «sometext» в строку, и все это в новом типе данных, чтобы все было выглядеть так:

SomeDataType (Float, Float, Float) "sometext"

Я получил это до сих пор:

readFromDisc filePath = do 
                        fileHandle <- openFile "/tmp/lala.txt" ReadMode
                        contents <- hGetContents fileHandle
                        putStrLn $ readOneLine contents

Если файл содержит это:

(5.0,6.0,7.0)"faraway"
(8.0,9.0,0.0)"holdon"

Я получаю:

"(5.0,6.0,7.0)\"faraway\""

Теперь, так как я получил это как строку, я думал об использовании

breakInput input = break (=='"') input

Чтобы получить это:

("(5.0,6.0,7.0)","\"faraway\"")

Это пара строк, и я собирался использовать что-то, чтобы разобрать тройку и текст из нее, но все это не кажется правильным.

Есть ли лучший способ сделать это?

Ответы [ 3 ]

6 голосов
/ 12 ноября 2010

Используйте функцию reads. Он проанализирует соответствующую часть в начале строки и вернет остаток строки.

parseLine :: String -> [((Double, Double, Double), String)]
parseLine line = do
  (tuple, line') <- reads line
  (string, _)    <- reads line'
  return (tuple, string)

-- parseLine "(5.0, 6.0, 7.0)\"faraway\"" ---> ((5.0, 6.0, 7.0), "faraway")

Это вернет список совпадений и проигнорирует мусор в конце строки. Поскольку ваш конкретный случай имеет однозначный синтаксический анализ, в результате успешного анализа будет получено только одно совпадение.

0 голосов
/ 13 ноября 2010

Быстрый взлом, если вы не заботитесь об ошибках:

data SomeDataType = SomeDataType (Float, Float, Float) String
                  deriving Read

readOneLine s = read ("SomeDataType " ++ s)
0 голосов
/ 12 ноября 2010
readThat (triple, str) = SomeDataType (read triple :: (Float, Float, Float)) 
                                      (read str :: String)

Быстро и грязно.

...