Hier ein Character-Scanner dafür:
Code: Alles auswählen
EnableExplicit
Structure CSVEntry
List Item.s()
EndStructure
#CSV_WithDoubleQuotes = 0 ; add double quotes to the output string (default)
#CSV_WithoutDoubleQuotes = 1 ; remove double quotes from the output string
Procedure ReadCSV(*p.Character, separator.c, List lst.CSVEntry(), flags = #CSV_WithDoubleQuotes)
Protected item.s
ClearList( lst() )
If *p = 0 Or *p\c = 0
ProcedureReturn ; empty string
EndIf
AddElement(lst())
While *p\c <> 0
While *p\c <> 0
If *p\c = 34 ; DoubleQuote start
If flags = #CSV_WithDoubleQuotes
item + Chr(*p\c) ; add starting DoubleQuote
EndIf
*p + SizeOf(Character)
While *p\c <> 0 And *p\c <> 34 ; scan for DoubleQuote end
If *p\c <> 10 And *p\c <> 13 ; do not add cariage return and line feed while in string
item + Chr(*p\c)
EndIf
*p + SizeOf(Character)
Wend
If *p\c = 34
If flags = #CSV_WithDoubleQuotes
item + Chr(*p\c) ; add ending DoubleQuote
EndIf
*p + SizeOf(Character)
EndIf
Continue ; continue scanning
ElseIf *p\c = separator ; separator found. exit inner loop
*p + SizeOf(Character)
Break
ElseIf *p\c = 10 Or *p\c = 13 ; cariage return or line feed found outside string: Break
Break
Else ; other character found, so add it to current item
item + Chr(*p\c)
*p + SizeOf(Character)
EndIf
Wend
AddElement(lst()\Item()) ; add current item to the list items
lst()\Item() = item
item=""
If *p\c = 13 ; for #CR$, #LF$, #CRLF$, #LFCR$:
AddElement(lst()) ; end of line found, so add a new list entry
*p + SizeOf(Character)
If *p\c = 10
*p + SizeOf(Character)
EndIf
ElseIf *p\c = 10
AddElement(lst())
*p + SizeOf(Character)
If *p\c = 13
*p + SizeOf(Character)
EndIf
EndIf
Wend
FirstElement(lst())
If ListSize(lst())=1 And ListSize(lst()\Item())=0
ClearList(lst())
EndIf
EndProcedure
Procedure.i ReadCSVFile(filename.s, separator.c, List lst.CSVEntry(), flags = #CSV_WithDoubleQuotes)
Protected file, *mem, format, line.s, stringpointer.i, result.i
ClearList( lst() )
file = ReadFile(#PB_Any,filename)
If file
format = ReadStringFormat(file)
*mem = AllocateMemory((Lof(file)+10)*SizeOf(Character)) ; read file into memory, line by line
If *mem
stringpointer = *mem
While Not Eof(file)
line = ReadString(file,format)
If Eof(file) = 0
line + #LF$
EndIf
CopyMemoryString(@line,@stringpointer)
Wend
ReadCSV(*mem,separator,lst(),flags) ; call ReadCSV() on the memory
result = #True
FreeMemory(*mem)
EndIf
CloseFile(file)
EndIf
ProcedureReturn result
EndProcedure
NewList entries.CSVEntry()
Define csv.s
csv = "Vorname,Nachname,PLZ,Adresse, Telefon"+#LF$
csv + "Max,Mustermann,53118,"+#DQUOTE$+"Musterweg 18, "+#LF$
csv + "Musterhausen"+#DQUOTE$+", "+#DQUOTE$+"01234/56789"+#DQUOTE$
ReadCSV(@csv,',',entries())
ForEach entries()
ForEach entries()\Item()
Debug Trim(entries()\Item())
Next
Debug "-----"
Next
Debug "-----------------------------------"
csv = "648;98;138"+#CRLF$
csv + "3186;3971;398"+#LFCR$
csv + "18638;34834;34384"+#LF$
csv + "1920;8;1977"+#CR$
csv + "1;2;3"
ReadCSV(@csv,';',entries())
ForEach entries()
ForEach entries()\Item()
Debug Trim(entries()\Item())
Next
Debug "-----"
Next
Define url.s = "http://download.finance.yahoo.com/d/quotes.csv?s=C+GLAD+HIMX+INSP+INTU+HRB+JTX+PODD+SILU+WFC&f=snoghl1b2b3p2"
Define filename.s = GetTemporaryDirectory()+"quotes.csv"
If InitNetwork()
ReceiveHTTPFile(url,filename)
EndIf
Debug "- File ----------------------------"
If ReadCSVFile(filename,',',entries(),#CSV_WithoutDoubleQuotes)
ForEach entries()
ForEach entries()\Item()
Debug Trim(entries()\Item())
Next
Debug "-----"
Next
Else
Debug "unable to read file"
EndIf
DeleteFile(filename)