2009-09-09 4 views
2

Я знаю, у меня уже есть функция Haskell Data.ByteString.Lazy разделить на CSV на один символ, например:Split байтовой строки на байт (вместо Word8 или Char)

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

Но я хотите разделить на несколько символов байтовой строки в (например, расщеплением на строку вместо Char):

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

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

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

ответ

2

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

tokenise x y = h : if null t then [] else tokenise x (drop (length x) t) 
    where (h,t) = breakSubstring x y 
+2

Хорошая функция там, прочитайте мой разум. Похоже, у нас есть консенсус 3 для breakSubstring, хотя мне все равно потребуется «toChunks» и «fromChunk» my ByteStrings для Stict ByteStrings и обратно, чтобы использовать это. Любая причина breakSubstring не в ByteString.Lazy? –

2

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

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

Там также байтовой строки-CSV пакет

+0

я бы преобразовать ленивых байтовых строк строгих байтовых строк использовать breakSubstring, но, похоже, это может быть стоит Это. –

+0

Похоже, breakSubstring не в GHC 6.8 libs ... это правильно? –

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