parse static method

Future<ListCSVFile> parse(
  1. FileOpener input,
  2. List<FieldDefinition> fieldDefinitions,
  3. GtfsDataset dataset, {
  4. bool where(
    1. MapRecord record
    )?,
  5. 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;
}