diff --git a/frontend/src/i18n/lang/en.json b/frontend/src/i18n/lang/en.json index 2cd6e516b..1703793ff 100644 --- a/frontend/src/i18n/lang/en.json +++ b/frontend/src/i18n/lang/en.json @@ -651,6 +651,7 @@ "parsingOptions": "Parsing Options", "delimiter": "Delimiter", "dateFormat": "Date Format", + "skipRows": "Skip Rows", "mapColumns": "Map Columns", "example": "e.g.", "preview": "Preview", diff --git a/frontend/src/services/migrator/csvMigration.ts b/frontend/src/services/migrator/csvMigration.ts index ecbc26561..7bcc25c03 100644 --- a/frontend/src/services/migrator/csvMigration.ts +++ b/frontend/src/services/migrator/csvMigration.ts @@ -46,6 +46,7 @@ export interface ImportConfig { delimiter: string quote_char: string date_format: string + skip_rows: number mapping: ColumnMapping[] } diff --git a/frontend/src/views/migrate/MigrationCSV.vue b/frontend/src/views/migrate/MigrationCSV.vue index df90fe5c8..88b47e41e 100644 --- a/frontend/src/views/migrate/MigrationCSV.vue +++ b/frontend/src/views/migrate/MigrationCSV.vue @@ -83,6 +83,17 @@ +
+ + +
@@ -240,6 +251,7 @@ const config = ref({ delimiter: ',', quote_char: '"', date_format: '2006-01-02', + skip_rows: 0, mapping: [], }) @@ -314,6 +326,7 @@ async function handleFileUpload() { delimiter: result.delimiter, quote_char: result.quote_char, date_format: result.date_format, + skip_rows: 0, mapping: result.suggested_mapping, } @@ -376,6 +389,7 @@ function resetToUpload() { delimiter: ',', quote_char: '"', date_format: '2006-01-02', + skip_rows: 0, mapping: [], } } diff --git a/pkg/modules/migration/csv/csv.go b/pkg/modules/migration/csv/csv.go index 415700666..9109dbd92 100644 --- a/pkg/modules/migration/csv/csv.go +++ b/pkg/modules/migration/csv/csv.go @@ -126,6 +126,7 @@ type ImportConfig struct { Delimiter string `json:"delimiter"` QuoteChar string `json:"quote_char"` DateFormat string `json:"date_format"` + SkipRows int `json:"skip_rows"` Mapping []ColumnMapping `json:"mapping"` } @@ -398,6 +399,11 @@ func PreviewImport(file io.ReaderAt, size int64, config ImportConfig) (*PreviewR return nil, &migration.ErrNotACSVFile{} } + // Skip rows if configured + if config.SkipRows > 0 && config.SkipRows < len(rows) { + rows = rows[config.SkipRows:] + } + result := &PreviewResult{ Tasks: make([]PreviewTask, 0, minInt(5, len(rows))), TotalRows: len(rows), @@ -567,6 +573,11 @@ func MigrateWithConfig(u *user.User, file io.ReaderAt, size int64, config Import return &migration.ErrNotACSVFile{} } + // Skip rows if configured + if config.SkipRows > 0 && config.SkipRows < len(rows) { + rows = rows[config.SkipRows:] + } + if len(rows) == 0 { return &migration.ErrFileIsEmpty{} }