Re: Reading a file into a "sequence"

new topic     » goto parent     » topic index » view thread      » older message » newer message

John F Dutcher wrote:
> 
> I thought I'd get the find on the inappropriate reference [1..4] before
> anyone answered...but you're too fast for me....Thanks

Here is a function to convert a Comma-Separated-Value string to
a sequence of fields. It handles escaped characters via the '\'
character and embedded quotes can also be represented by a twin
quotes.

function CSV_to_Sequence(object pText)
    sequence lResult
    integer lInField
    integer lFld
    integer lPos
    
    lResult = {}
    if atom(pText) then
        return lResult
    end if
    
    if length(pText) != 0 then
        if pText[length(pText)] = '\n' then
            pText = pText[1..length(pText)-1]
        end if
    end if
        
    lInField = 0
    lFld = 0
    lPos = 1
    while lPos <= length(pText) do
        if pText[lPos] = '"' then
            if lInField then
                if lPos != length(pText) then
                    if pText[lPos+1] = '"' then
                        -- First quote of a Double quote found.
                        lResult[lFld] &= '"'
                        lPos += 1
                    else
                        lInField = 0
                    end if
                else
                    -- End of field found.
                    lInField = 0
                end if
            else
                -- Start of field found
                lInField = 1
                lResult = append(lResult, {})
                lFld = length(lResult)
            end if
        elsif pText[lPos] = '\\' then
            -- Found the 'escape' lead in character
            if lInField then
                if lPos != length(pText) then
                    lPos += 1
                    if pText[lPos] = 'n' then  --New Line
                        lResult[lFld] &= 10 
                    elsif pText[lPos] = 't' then --Tab
                        lResult[lFld] &= 9
                    elsif pText[lPos] = 'r' then --Carriage Return
                        lResult[lFld] &= 13
                    elsif pText[lPos] = '\\' then -- Back Slash
                        lResult[lFld] &= '\\'
                    elsif pText[lPos] = 's' then -- Space
                        lResult[lFld] &= ' '
                    else
                        lResult[lFld] &= pText[lPos]
                    end if
                end if
            else
                -- ignore it
            end if
        else
            if lInField then
                -- add it to current field data
                lResult[lFld] &= pText[lPos]
            else
                -- do nothing as I'm not in a field.
            end if
        end if            
        lPos += 1
    end while
    
    return lResult
end function


Use it like this ...

  sequence Fields

  Fields = CSV_to_Sequence( gets(fh) )
 
-- 
Derek Parnell
Melbourne, Australia

new topic     » goto parent     » topic index » view thread      » older message » newer message

Search



Quick Links

User menu

Not signed in.

Misc Menu