Разделить ByteString на ByteString (вместо Word8 или Char)

Я знаю, что у меня уже есть функция Haskell Data.ByteString.Lazy для разделения CSV на один символ, например:

split :: Word8 -> ByteString -> [ByteString]

Но я хочу разбить на многосимвольную ByteString (например, разбить на String вместо Char):

split :: ByteString -> ByteString -> [ByteString]

У меня есть многосимвольные разделители в CSV-подобном текстовом файле, который мне нужно проанализировать, и отдельные символы сами появляются в некоторых полях, поэтому выбор только одного символа-разделителя и отбрасывание других загрязнит импорт данных.

У меня были некоторые идеи о том, как это сделать, но они кажутся довольно хакерскими (например, взять три слова Word8, проверить, являются ли они комбинацией разделителей, начать новое поле, если они есть, выполнить рекурсию дальше), и я думаю, что я бы все равно изобретать велосипед. Есть ли способ сделать это, не перестраивая функцию с нуля?


person Daniel Quinlan    schedule 09.09.2009    source источник


Ответы (2)


Документация Bytestrings breakSubstring содержит функцию, которая делает то, что вы просите:

tokenise x y = h : if null t then [] else tokenise x (drop (length x) t)
    where (h,t) = breakSubstring x y
person sth    schedule 09.09.2009
comment
Хорошая функция, читай мои мысли. Похоже, у нас есть консенсус 3 для breakSubstring, хотя мне все еще нужно toChunks и fromChunk my ByteStrings в Stict ByteStrings и обратно, чтобы использовать это. По какой причине breakSubstring отсутствует в ByteString.Lazy? - person Daniel Quinlan; 09.09.2009

В байтовой строке есть несколько функций для разделения на подпоследовательности:

breakSubstring :: ByteString -> ByteString -> (ByteString,ByteString)

Также есть

person Don Stewart    schedule 09.09.2009
comment
Мне пришлось бы преобразовать ленивые ByteStrings в строгие ByteStrings, чтобы использовать breakSubstring, но похоже, что оно того стоит. - person Daniel Quinlan; 09.09.2009
comment
Похоже, что breakSubstring нет в библиотеках GHC 6.8... верно? - person Jared Updike; 16.10.2009