【问题标题】:Split ByteString on a ByteString (instead of a Word8 or Char)在 ByteString 上拆分 ByteString(而不是 Word8 或 Char)
【发布时间】:2010-11-26 18:24:10
【问题描述】:

我知道我已经有 Haskell Data.ByteString.Lazy 函数将 CSV 拆分为单个字符,例如:

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

但我想在多字符的 ByteString 上进行拆分(例如在 String 而不是 Char 上拆分):

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

我在需要解析的类似 csv 的文本文件中有多个字符分隔符,并且各个字符本身出现在某些字段中,因此仅选择一个分隔符并丢弃其他分隔符会污染数据导入。

我对如何做到这一点有一些想法,但它们似乎有点老套(例如,取三个 Word8,测试它们是否是分隔符组合,如果是,则开始一个新字段,进一步递归),我想象一下,无论如何我都会重新发明一个轮子。有没有办法在不从头开始重建功能的情况下做到这一点?

【问题讨论】:

    标签: string text haskell csv bytestring


    【解决方案1】:

    字节串中有几个函数可以分割子序列:

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

    还有一个

    【讨论】:

    • 我必须将惰性字节字符串转换为严格字节字符串才能使用 breakSubstring,但看起来可能值得。
    • 看起来 breakSubstring 不在 GHC 6.8 库中……对吗?
    【解决方案2】:

    Bytestrings breakSubstring 的文档包含一个功能,可以满足您的要求:

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

    【讨论】:

    • 不错的功能,读我的心。看起来我们对 breakSubstring 的共识是 3,即使我仍然需要“toChunks”和“fromChunk”我的 ByteStrings 到 Stict ByteStrings 并返回使用它。有什么理由 breakSubstring 不在 ByteString.Lazy 中?
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多