From bdb517531625af0fd31c09693bcb09eb54bddeaf Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Sep 2023 13:34:38 -0400 Subject: [PATCH] Improve auto-detection of import data format --- netbox/utilities/forms/bulk_import.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/netbox/utilities/forms/bulk_import.py b/netbox/utilities/forms/bulk_import.py index 9b0e4f18a..05078ebfb 100644 --- a/netbox/utilities/forms/bulk_import.py +++ b/netbox/utilities/forms/bulk_import.py @@ -61,13 +61,18 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form): # Determine the data format if self.cleaned_data['format'] == ImportFormatChoices.AUTO: - format = self._detect_format(data) + if self.cleaned_data['csv_delimiter'] != CSVDelimiterChoices.AUTO: + # Specifying the CSV delimiter implies CSV format + format = ImportFormatChoices.CSV + else: + format = self._detect_format(data) else: format = self.cleaned_data['format'] # Process data according to the selected format 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: self.cleaned_data['data'] = self._clean_json(data) elif format == ImportFormatChoices.YAML: @@ -85,7 +90,10 @@ class BulkImportForm(BootstrapMixin, SyncedDataMixin, forms.Form): return ImportFormatChoices.JSON if data.startswith('---') or data.startswith('- '): 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 except IndexError: pass