Re: Reading comma delimited .csv data files
- Posted by JAYBEEDEE <daviesjb at liv??c.uk> Jan 19, 2008
- 617 views
CChris wrote: > > JAYBEEDEE wrote: > > > > > > I'm having difficulty in getting Eu to read multiple column data tables > > created > > via Excel > > and saved as comma delimited text files. > > > > I'm confused by the get(), gets(), getc() and value() commands. > > > > Using gets() I have no problem in reading data in a single column, but if > > there > > are > > more than one, then gets() reads each row (line) as a single element. > > > > For example, the csv file might be of the form: > > > > Month,, > > 6,, > > 8,, > > 1988,, > > > > > > 2,6,8 > > 5,12,25.7 > > . > > etc > > > > Note 2 blank lines after 1988,, and blank cells in the grid as ,, > > > > I would like to write the data into a sequence emulating 3 horizontal > > elements > > and n rows like > > > > data{{}{}{}} so that I can extract values using a statement like > > cell_value=data[row][col] > > > > So far I'm defeated! Any suggestions? > > Euphoria doesn't have standard routines to read formatted input, contrary to > most other languages. Use the strtok library by Kat (in the archive) to split > a text string using commas as delimiters. > > gets(your_file) will return say "8,," (a full line as a text string), and > applying > the right function in strtok to this will split it to {"8","",""} (a sequence > of substrings some of which may be empty). > > Now, if any of these substrings is known to represent a number, you can call > value() to perform the conversion. > > FYI, win32lib has routines (w32split(), w32TextToNumber() and others) to do > the job. > > A simple splitting function could be coded like this: > }}} <eucode> > function split(sequence s) > integer pos,prev_pos > sequence result > > pos=find(',',s) > if not pos then > return {s} -- no splitting took place > end if > result={} > prev_pos=0 > while pos do > result=append(result,s[prev_pos+1..pos-1]) -- another substring > -- substrings may well be empty > -- a sustring extends from prev delim+1 to next delim-1 > -- find next > prev_pos=pos > pos=find_from(',',s,prev_pos+1) > end while > -- get tail substring and return the whole array > return append(result,s[prev_pos+1..$]) > end function > </eucode> {{{ > CChris Thanks, Chris I had tried using find and find_from to slice up the strings but always got a zero result. I note that you included the comma in single quotes ',' whereas I used double quotes ",". Was this where I went wrong? There doesn't seem to be anything in the Euphoria Manual about this distinction. Your code looks is if it should do the job, but I haven't tried it yet. Incidentally - is there an index or database of "include" files and the procedures they contain? Searching the Archives comes up with a lot of chat, and files with unhelpful titles such as "Routines I wish had been included with Euphoria", but no indication as to what they contain. Makes life hard for us newbies.