5 // to be moved in ecere?
6 public class FileHandler
16 public struct CSVParserParameters
20 int expectedFieldCount;
21 bool tolerateNewLineInValues;
26 CSVParserParameters classicParameters = { ',', '\"', 0, false };
28 public struct CSVParserState
36 public class CSVParser : public FileHandler
39 CSVParserParameters options { ',', '\"', 0, false };
42 void PrintMessage(typed_object object, ...)
46 va_start(args, object);
47 PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
52 virtual bool OnMessage(String message)
54 ::PrintLn(this._class.name, ": ", message,
55 " lineNum=", info.lineNum,
56 " charNum=", info.charNum,
57 " rowNum=", info.rowNum,
58 " fieldNum=", info.fieldNum);
61 virtual bool OnRowStrings(Array<String> strings);
63 virtual void Process()
65 bool quoted = false, status = true;
66 Array<String> values { };
67 int start = 0, end = 0;
69 Array<char> buffer { minAllocSize = 4096 };
76 while(!file.Eof() && status)
82 offset = readCount - start;
83 if(offset > buffer.minAllocSize / 2)
84 buffer.minAllocSize += 4096;
85 memmove(&buffer[0], &buffer[start], offset);
90 readCount = offset + file.Read(&buffer[offset], 1, buffer.minAllocSize - offset);
91 for(c = offset; c < readCount && status; c++)
96 if(ch == options.valueQuotes)
104 if(ch == options.valueQuotes)
109 //else if(ch == options.fieldSeparator || ch == '\n')
110 else if(ch == options.fieldSeparator ||
111 (ch == '\n' && (!options.tolerateNewLineInValues || info.fieldNum == options.expectedFieldCount-1)))
114 String value = new char[len+1];
115 memcpy(value, &buffer[start], len);
124 status = OnRowStrings(values);
144 String value = new char[len+1];
145 memcpy(value, &buffer[start], len);
149 if(values.count && status)
151 status = OnRowStrings(values);