fromCsvString static method
Imports from a CSV string
Implementation
static ImportResult fromCsvString(
String csvContent, {
String schemaName = 'ImportedData',
String delimiter = ',',
bool hasHeader = true,
}) {
try {
final converter = CsvDecoder(
fieldDelimiter: delimiter,
dynamicTyping: true,
);
final rows = converter.convert(csvContent);
if (rows.isEmpty) {
return ImportResult(
schema: _createEmptySchema(schemaName),
data: [],
rowCount: 0,
error: 'Empty CSV',
);
}
// Extract the header
List<String> headers;
int dataStartIndex;
if (hasHeader) {
headers = rows.first.map((e) => e.toString()).toList();
dataStartIndex = 1;
} else {
headers = List.generate(rows.first.length, (i) => 'campo_$i');
dataStartIndex = 0;
}
// Infer the types from the data
final fieldTypes = _inferFieldTypes(rows, headers, dataStartIndex);
final fields = <FieldDefinition>[];
for (int i = 0; i < headers.length; i++) {
fields.add(
FieldDefinition(
name: _sanitizeFieldName(headers[i]),
displayName: headers[i],
type: fieldTypes[i],
isRequired: false,
),
);
}
final data = <Map<String, dynamic>>[];
for (int i = dataStartIndex; i < rows.length; i++) {
final row = rows[i];
final rowMap = <String, dynamic>{};
for (int j = 0; j < headers.length && j < row.length; j++) {
final fieldName = _sanitizeFieldName(headers[j]);
rowMap[fieldName] = row[j];
}
data.add(rowMap);
}
// Create a dynamic schema
final schema = _ImportedDataSchema(
name: schemaName,
displayName: schemaName,
description: 'Schema imported from CSV',
fields: fields,
sampleData: data.isNotEmpty ? data.first : {},
);
return ImportResult(schema: schema, data: data, rowCount: data.length);
} catch (e) {
return ImportResult(
schema: _createEmptySchema(schemaName),
data: [],
rowCount: 0,
error: 'Error parsing the CSV: $e',
);
}
}