Re: Reading a file into a "sequence"
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
|
Not Categorized, Please Help
|
|