Improve auto-detection of import data format

This commit is contained in:
Jeremy Stretch 2023-09-05 13:34:38 -04:00
parent 3cebcdd568
commit bdb5175316

View File

@ -61,13 +61,18 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form):
# Determine the data format # Determine the data format
if self.cleaned_data['format'] == ImportFormatChoices.AUTO: if self.cleaned_data['format'] == ImportFormatChoices.AUTO:
if self.cleaned_data['csv_delimiter'] != CSVDelimiterChoices.AUTO:
# Specifying the CSV delimiter implies CSV format
format = ImportFormatChoices.CSV
else:
format = self._detect_format(data) format = self._detect_format(data)
else: else:
format = self.cleaned_data['format'] format = self.cleaned_data['format']
# Process data according to the selected format # Process data according to the selected format
if format == ImportFormatChoices.CSV: if format == ImportFormatChoices.CSV:
self.cleaned_data['data'] = self._clean_csv(data, delimiter=self.cleaned_data['csv_delimiter']) delimiter = self.cleaned_data.get('csv_delimiter', CSVDelimiterChoices.AUTO)
self.cleaned_data['data'] = self._clean_csv(data, delimiter=delimiter)
elif format == ImportFormatChoices.JSON: elif format == ImportFormatChoices.JSON:
self.cleaned_data['data'] = self._clean_json(data) self.cleaned_data['data'] = self._clean_json(data)
elif format == ImportFormatChoices.YAML: elif format == ImportFormatChoices.YAML:
@ -85,7 +90,10 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form):
return ImportFormatChoices.JSON return ImportFormatChoices.JSON
if data.startswith('---') or data.startswith('- '): if data.startswith('---') or data.startswith('- '):
return ImportFormatChoices.YAML return ImportFormatChoices.YAML
if ',' in data.split('\n', 1)[0]: # Look for any of the CSV delimiters in the first line (ignoring the default 'auto' choice)
first_line = data.split('\n', 1)[0]
csv_delimiters = CSVDelimiterChoices.values()[1:]
if any(x in first_line for x in csv_delimiters):
return ImportFormatChoices.CSV return ImportFormatChoices.CSV
except IndexError: except IndexError:
pass pass