Older Version Newer Version

scapegoat scapegoat Feb 13, 2006

This code will take as input a comma seperated text data file (a '.csv'), and will create an array with the following dimensions:

First dimension: The number of lines in the .csv file
Second dimension: The number of fields per line in the .csv

The zero position of the array will be filled with the contents of the first line of the .csv, which can be the field names for the rest of the data lines.

The code includes an array inspector window to aid in debugging.

This code worked ok with my .csv which had 294 lines, each line with six fields; the last field being a 'comment' field which contained text within double quotes.

The subroutines were hard-coded to ignore commas found within the text inside the sixth field.

Modify to your use at will!

[[code]]
global readingsarray$
global datalinecounter
dim readingsarray$(11,11)

call LoadGraphData

call ArrayInspect

wait


sub LoadGraphData

'find out how big the file is before dimming
datalinecounter = -1 'offset the final wend below
open "blood_pressure_readings.csv" for input as #datafile
while eof(#datafile) = 0
line input #datafile, datastring$
datalinecounter = datalinecounter + 1
wend
close #datafile


'create the correct-sized array
'add 1 because array starts at zero
redim readingsarray$(datalinecounter + 1,5)

rowcounter = 0
open "blood_pressure_readings.csv" for input as #datafile

for dataloadloop = 0 to datalinecounter
line input #datafile, datastring$

itemToFill = 0
ignore = 0

for scanChar = 1 to len(datastring$)

if mid$(datastring$,scanChar,1) = chr$(34) then ignore = 1

if (mid$(datastring$,scanChar,1) = "," and ignore = 0) then
itemToFill = itemToFill + 1
else
readingsarray$(rowcounter,itemToFill) = _
readingsarray$(rowcounter,itemToFill) + _
mid$(datastring$,scanChar,1)
end if

next scanChar

rowcounter = rowcounter + 1
next dataloadloop

close #datafile
end sub




sub ArrayInspect

WindowWidth = 550
WindowHeight = 302

TexteditorColor$ = "white"
texteditor #arrayinsp.text, 1, 5, 540, 250

open "Array Inspector" for window as #arrayinsp
print #arrayinsp, "font ms_sans_serif 10"
print #arrayinsp, "trapclose [quit.arrayinsp]"

for printout = 0 to datalinecounter
print #arrayinsp.text, "Line " + str$(printout) + " of " + str$(datalinecounter) + " : ";
for subloop = 0 to 5
print #arrayinsp.text, readingsarray$(printout,subloop);
if subloop < 5 then
print #arrayinsp.text, ",";
else
print #arrayinsp.text, ""
end if
next subloop

next printout
end sub

[quit.arrayinsp] 'close inspector
close #arrayinsp
wait


[[code]]

Here is some example .csv data which should work for testing the above code. Save it to a text file then change the file extension to '.csv'. The actual filename referenced in the code above is 'blood_pressure_readings.csv'.

[[code]]
Date, Time, Systolic, Diastolic, Pulse, Notes
28/07/2005,08:45,116,92,75,""
28/07/2005,10:30,124,96,68,""
28/07/2005,18:30,134,94,65,""
30/07/2005,12:00,107,76,70,"Whatever you want,"
31/07/2005,12:00,110,75,85,""
31/07/2005,15:00,108,78,85,"as notes, can go "
31/07/2005,18:00,116,88,68,""
02/08/2005,12:00,107,78,78,"between the quotes"
02/08/2005,20:00,115,84,85,""
03/08/2005,20:00,102,73,92,"in"
04/08/2005,08:30,116,86,66,""
04/08/2005,12:00,121,100,68,"the sixth"
04/08/2005,12:30,116,92,78,""
04/08/2005,14:10,110,75,76,"field"
05/08/2005,11:45,115,76,88,""
05/08/2005,19:00,120,80,89,"including, commas"
05/08/2005,20:20,112,81,84,""
05/08/2005,23:00,121,89,86,""
05/08/2005,23:59,113,75,82,""
[[code]]