Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Daniel QuinlanОтветов: 2

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

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

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

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

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

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

csvtextstringhaskellbytestring

Ответы

Ответ 1 · рейтинг 2 · sth

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

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

Ответ 2 · рейтинг 2 · Don Stewart

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

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

Также есть

  • пакет bytestring-csv, http://hackage.haskell.org/package/bytestring-csv а>
  • разделенный пакет: http://hackage.haskell.org/package/split для строк .

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы