Advertisement
Revolucent

REBOL 3 CSV-DECODE

Apr 18th, 2013
2,440
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Copyright (c) 2013 Gregory Higley
  2.  
  3. ; Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
  4. ; files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
  5. ; modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
  6. ; is furnished to do so, subject to the following conditions:
  7.  
  8. ; The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
  9.  
  10. ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  11. ; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  12. ; LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  13. ; CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  14.  
  15. rebol [
  16.     Author: "Gregory Higley"
  17.     Title: "Revolucent CSV Library"
  18. ;   Type: module
  19. ;   Needs: [2.101.0]
  20. ]
  21.  
  22. whitespace: charset " ^-"
  23.  
  24. csv-decode: funct [
  25.     "Parses a single line of CSV and returns a block of quoted values."
  26.     line [string!]
  27.     /separated-by
  28.         sep-char [char!] "Defaults to comma"
  29.     /quoted-by
  30.         quote-char [char!] "Defaults to double quote"
  31.     /escaped-by
  32.         escape-char [char! none!] "Defaults to none"
  33.     /local
  34.         chunk [string!]
  35.         item [string!]
  36.         items [block!]
  37. ] [
  38.     default quote-char first {""}
  39.     default sep-char #","
  40.     items: copy []
  41.     characters: complement charset rejoin [" ^-" sep-char]
  42.     either escape-char [
  43.         ; If we have an escape char our quoted-item becomes much more complex
  44.         escaped-quote: rejoin [escape-char quote-char]
  45.         quoted-item: [
  46.             (item: copy "")
  47.             quote-char
  48.             any [ copy chunk to escaped-quote escaped-quote (repend item [chunk quote-char]) ]
  49.             copy chunk to quote-char (append item chunk)
  50.             quote-char
  51.         ]
  52.     ] [
  53.         quoted-item: [quote-char copy item to quote-char quote-char]
  54.     ]
  55.     rules: [
  56.         some [
  57.             any whitespace sep-char (append items "")
  58.         |   any whitespace quoted-item any whitespace sep-char (append items item)
  59.         |   any whitespace copy item some characters any whitespace sep-char (append items item)
  60.         ][
  61.             any whitespace end (append items "")
  62.         |   any whitespace quoted-item any whitespace end (append items item)
  63.         |   any whitespace copy item some characters any whitespace end (append items item)
  64.         ]
  65.     ]
  66.     either parse line rules [items] [none]
  67. ]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement