2014-12-30 3 views
0

Мне нужна помощь, анализирующая список целых чисел с разделителями-запятыми из файла, когда список целых чисел может быть любой длины. Строка может выглядеть как «1,2,3,4,5,6,7,8, ...», и список, который мне нужен, будет похож на [1,2,3,4,5,6,7, 8, ...].Haskell анализирует список целых чисел с Attoparsec

Формат файла выглядит следующим образом:

0,0:1; -- minimum of 1 integer after the : 
0,1:1,2; 
0,2:5; 
0,3:5,16,223,281; -- any amount of integers can follow the : 
... 

Мой анализатор в настоящее время читает только одно целое, но для этого нужно, чтобы начать читать больше. Я могу использовать takeTill прочитать все номера в байтовой строки, но тогда я должен разобрать еще одну строку с той же проблемой, не зная точно, сколько чисел может быть:

parseTile :: Parser Tile 
parseTile = do 
    x <- decimal 
    char ',' 
    y <- decimal 
    char ':' 
    --t <- takeTill (\x -> x == ';') 
    t <- decimal 
    char ';' 
    return $ Tile x y t 

Я нашел this, но не помогает мне, потому что мой файл не является json-файлом.

+0

Вы должны смотреть на 'sepBy *' комбинаторы, вы можете получить что-то вроде '' 'commaSepInts = десятичное' sepBy1' (полукокса '') '' '; '' 'row = commaSepInts' sepBy1' (char ':') '' '. Не уверен, что это решает все ваши проблемы, но 'sepBy' - это, вероятно, то, что вы ищете. – bheklilr

+0

@bheklilr Спасибо, bheklilr, sepBy действительно был решением. – user3638162

ответ

3

Вы можете использовать sepBy и decimal:

parseTile :: Parser Tile 
parseTile = do 
    x <- decimal 
    char ',' 
    y <- decimal 
    char ':' 
    t <- decimal `sepBy` (char ',') 
    char ';' 
    return $ Tile x y t 
+0

Спасибо. Я знал, что должен быть легкий ответ, но я не мог на него наложить свой палец. – user3638162

Смежные вопросы