2009-09-09 86 views
2

我知道我已经有哈斯克尔Data.ByteString.Lazy功能对单个字符分割CSV,如:拆分字节串上一个字节串(而不是Word8或字符)

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

但我想拆就多字符的字节字符串(如拆分一个字符串,而不是一个字符):

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

那里的功能很好,请阅读我的想法。 看起来我们对breakSubstring有3的一致意见,即使我仍然需要将toChunks和fromChunk ByteStrings设置为Stict ByteStrings并返回来使用它。任何原因breakSubstring不在ByteString.Lazy中? – 2009-09-09 14:04:51

2

有几个功能字节字符串的分割上的子序列:

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

还有一个

+0

我会偷懒字节串转换为严格的字节串用breakSubstring,但它看起来像它可能是值得它。 – 2009-09-09 11:45:07

+0

它看起来像breakSubstring不在GHC 6.8 libs中......是吗? – 2009-10-16 16:10:33