2009-09-09 6 views
2

Je sais que je l'ai déjà la fonction Haskell Data.ByteString.Lazy de diviser un fichier CSV sur un seul caractère, tels que:de Split ByteString sur un ByteString (au lieu d'un Word8 ou Char)

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

Mais je vouloir diviser sur un ByteString plusieurs caractères (comme le fractionnement sur une chaîne au lieu d'un Char):

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

je séparateurs à plusieurs caractères dans un fichier texte comme csv que je dois analyser, et l'individu les caractères eux-mêmes apparaissent dans certains des champs, donc en choisissant un seul caractère de séparation et en jetant l'autre rs pourrait contaminer l'importation de données. J'ai eu quelques idées sur la façon de faire cela, mais elles semblent un peu hacks (par exemple, prendre trois Word8, tester si elles sont la combinaison séparateur, commencer un nouveau champ si elles sont, recurse plus loin), et J'imagine que je réinventerais une roue de toute façon. Y at-il un moyen de le faire sans reconstruire la fonction à partir de zéro?

Répondre

2

La documentation de chaînes d'octets breakSubstring contient une fonction qui fait ce que vous demandez:

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

Belle fonction là-bas, lisez dans mes pensées. Il semble que nous ayons un consensus de 3 pour breakSubstring, même si je vais encore besoin de "toChunks" et "fromChunk" mon ByteStrings pour coller ByteStrings et de nouveau pour l'utiliser. Une raison quelconque breakSubstring n'est pas dans ByteString.Lazy? –

2

Il y a quelques fonctions bytestring pour le fractionnement sur sousséquences:

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

Il y a aussi un

+0

je dois convertir des chaînes ordinaires paresseux à des chaînes ordinaires strictes à utiliser breakSubstring, mais il semble que cela pourrait être utile il. –

+0

Il semble que breakSubstring ne soit pas dans GHC 6.8 libs ... n'est-ce pas? –

Questions connexes