transactionsFromCsv function
Parses a CSV byte stream efficiently.
This implementation uses a Hybrid Strategy:
- Fast Path: If a line contains no quotes, it uses Dart's native
split, which is extremely fast. - Robust Path: If quotes are detected, it switches to a manual character parser for that line to handle escaped commas correctly.
This ensures maximum performance for standard datasets while maintaining correctness for complex ones, without requiring user configuration.
Implementation
Stream<List<String>> transactionsFromCsv(
Stream<List<int>> csvStream, {
String fieldDelimiter = ',',
String eol = '\n',
}) {
return csvStream
.transform(utf8.decoder)
.transform(const LineSplitter())
.map((line) {
if (line.isEmpty) return const <String>[];
// Check for quotes once.
// If no quotes, use the native split.
if (!line.contains('"')) {
return line.split(fieldDelimiter).map((e) => e.trim()).toList();
}
return _parseComplexCsvLine(line, fieldDelimiter);
})
.where((row) => row.isNotEmpty);
}