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{}
}