parse static method
Future<ListCSVFile>
parse(
- FileOpener input,
- List<
FieldDefinition> fieldDefinitions, - GtfsDataset dataset, {
- bool where(
- MapRecord record
- bool evaluateIndividualFields = false,
Implementation
static Future<ListCSVFile> parse(
FileOpener input,
List<FieldDefinition> fieldDefinitions,
GtfsDataset dataset, {
bool Function(MapRecord record)? where,
bool evaluateIndividualFields = false,
}) async {
final (stream: fileStream, name: fileName) = input;
List<FieldDefinition>? header;
List<ListRecord> records = [];
await for (final rawLine in fileStream()
.transform(utf8.decoder)
.transform(
CsvToListConverter(
shouldParseNumbers: false,
csvSettingsDetector: FirstOccurrenceSettingsDetector(
eols: ['\r\n', '\n'],
),
),
)) {
ListRecord record = ListRecord.from(rawLine);
if (header == null) {
header = record
.map((e) {
final field = fieldDefinitions.firstWhere(
(element) => element.name == e,
orElse: () {
_logger.warning(
'Unknown field in $fileName, header = ${record.join(',')}',
);
return FieldDefinition(
e ?? 'unnamed_field',
(dataset, header, records) => null,
type: TextFieldType(),
);
},
);
return field;
})
.toList(growable: false);
continue;
}
MapRecord? mapRecord;
if (evaluateIndividualFields) {
mapRecord ??= toMapRecord(header, record);
await _checkForIndividualField(
mapRecord,
fieldDefinitions,
header,
dataset,
);
}
if (where != null) {
mapRecord ??= toMapRecord(header, record);
if (where(mapRecord)) {
records.add(record);
}
} else {
records.add(record);
}
}
assert(header != null, 'CSV file is empty');
final file = ListCSVFile(header: header ?? [], records: records);
_checkForOverallField(file, fieldDefinitions, header!, dataset);
return file;
}