' This program will parse a Standard Comma Quote Delimited file
'
' Written by Bill Haesslein in IBasic Pro on 2006-05-05
'   Converted to EBasic 2008-11-21
'
'  Input Test Data files look like:
'	"Doe, John",1313 Mockingbird Lane,"Dallas, Tx 75123"
'	"Smith, Sam","13 Avenue """A"","Washington, DC 01000"
'
'  Output Returned:
'	Doe, John
'	1313 Mockingbird Lane
'	Dallas, Tx 75123
'	Smith, Sam
'	13 Avenue "A"
'	Washington, DC 01000
'
$main
def version$
string:version$="1.1"

autodefine "off"

def rtn:string
def File_Path, filter, filename:string
def I_file,O_file:file
def max, finished, i, j, all_ok:int
def File_Name_I, File_Name_O:string
def Field_Values[30], Returned_Value:string
def line_in[1500]:istring

all_ok = 1

File_Path = "C:\\TEMP\\"

filter = "Input File (*.csv)|*.csv||"
filename = filerequest("Select Input File",0,1,filter,"csv",0, File_Path)
if (filename = "") then goto Final

File_Name_I = filename

filter = "Output File (*.TXT)|*.txt||"
filename = filerequest("Select Output File",0,0,filter,"txt",0, File_Path)
if (filename = "") then goto Final

File_Name_O = filename

max = 30
j = 0

openconsole

if (openfile(I_file,File_Name_I,"R") <> 0)
	print "File: ", File_Name_I, " Not able to Open Input"
	goto Aborted
endif

if (openfile(O_file,File_Name_O,"W") <> 0)
	print "File: ", File_Name_O, " Not able to Open Output"
	goto Aborted
endif

while (read(I_file,line_in) = 0)
	do
		finished = Comma_Delimited_Parser(line_in, Returned_Value)
'   j += 1 is short hand for j = j + 1
		j += 1
		Field_Values[j] = Returned_Value
	until (finished)
' at this point you could do some thing specific with each line
' print data
	for i = 1 to j
		write O_file, Field_Values[i]
	next i
endwhile

closefile O_file
closefile I_file

goto Final

label Aborted
all_ok = 0
print "---Program Aborted---"
if (all_ok = 0)
	print " "
	input "Press Enter to end: ",rtn
endif

label Final
closeconsole

END

'__________________________________________________________________
SUB Comma_Delimited_Parser(Original:pointer, Returned:Pointer), int
'------------------------------------------------------------------
def cchar, pchar, fldn, c, q:string
def q_flag, i, l:int

' ="
q = chr$(34)
' =,
c = chr$(44)

l = len(#<string>Original)
q_flag = 0
pchar = ""
fldn = ""
for i = 1 to l
	cchar = mid$(#<string>Original,i,1)
'  if current char (cchar) = " and previous char (pchar) <> "
	if (cchar = q) and (pchar <> q)
'  old programmers trick: start q_flag at 0, then q_flag = 1 - 0 = 1, or q_flag = 1 - 1 = 0
'   or if flag is on (1), turn off (0), if off (0) then turn on (1)
		q_flag = 1 - q_flag
		goto skipit
	endif
'  if current char = " and previous char = "
	if (cchar = q) and (pchar = q)
		fldn = ""
		q_flag = 1 - q_flag
		cchar = ""
		goto skipit
	endif
'  if current char = , and not a quoted string
	if (cchar = c) and (q_flag = 0)
		#<string>Original = mid$(#<string>Original,i+1)
		#<string>Returned = fldn
'  return 0 means not done with string
		return 0
	endif
'  if (current char <> , or quote flag is on) and current char <> "
	if ((cchar <> c) or (q_flag = 1)) and (cchar <> q)
		fldn += cchar
	endif
label skipit
pchar = cchar
next i
#<string>Original = ""
#<string>Returned = fldn
'  return 1 means string has been completely delimited
return 1
endsub