5 public struct CSVFileParameters
9 int expectedFieldCount;
10 bool tolerateNewLineInValues;
15 CSVFileParameters classicParameters = { ',', '\"', 0, false };
17 public struct CSVFileState
25 public class CSVFile : public File
28 CSVFileParameters options;
31 void PrintMessage(typed_object object, ...)
35 va_start(args, object);
36 PrintStdArgsToBuffer(buffer, sizeof(buffer), object, args);
41 virtual bool OnMessage(String message)
43 ::PrintLn(this._class.name, ": ", message,
44 " lineNum=", info.lineNum,
45 " charNum=", info.charNum,
46 " rowNum=", info.rowNum,
47 " fieldNum=", info.fieldNum);
50 virtual bool OnRowStrings(Array<String> strings);
52 virtual void Process()
54 bool quoted = false, status = true;
55 Array<String> values { };
56 int start = 0, end = 0;
58 Array<char> buffer { minAllocSize = 4096 };
65 while(!Eof() && status)
71 offset = readCount - start;
72 if(offset > buffer.minAllocSize / 2)
73 buffer.minAllocSize += 4096;
74 memmove(&buffer[0], &buffer[start], offset);
79 readCount = offset + Read(&buffer[offset], 1, buffer.minAllocSize - offset);
80 for(c = offset; c < readCount && status; c++)
85 if(ch == options.valueQuotes)
93 if(ch == options.valueQuotes)
98 //else if(ch == options.fieldSeparator || ch == '\n')
99 else if(ch == options.fieldSeparator ||
100 (ch == '\n' && (!options.tolerateNewLineInValues || info.fieldNum == options.expectedFieldCount-1)))
103 String value = new char[len+1];
104 memcpy(value, &buffer[start], len);
113 status = OnRowStrings(values);
133 String value = new char[len+1];
134 memcpy(value, &buffer[start], len);
138 if(values.count && status)
140 status = OnRowStrings(values);