1
0
mirror of https://github.com/duke-git/lancet.git synced 2026-02-04 12:52:28 +08:00

refactor: update signature of WriteMapsToCsv function

g
This commit is contained in:
dudaodong
2024-01-24 11:54:42 +08:00
parent e0c9ccbce3
commit be62aaac9b
9 changed files with 46 additions and 46 deletions

View File

@@ -760,7 +760,9 @@ func escapeCSVField(field string, delimiter rune) string {
// the maps will be sorted by key in alphabeta order, then be written into csv file.
// appendToExistingFile: If true, data will be appended to the file if it exists.
// delimiter: Delimiter to use in the CSV file.
func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingFile bool, delimiter ...rune) error {
// headers: order of the csv column headers, needs to be consistent with the key of the map.
func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingFile bool, delimiter rune,
headers ...[]string) error {
for _, record := range records {
for _, value := range record {
if !isCsvSupportedType(value) {
@@ -769,40 +771,31 @@ func WriteMapsToCsv(filepath string, records []map[string]any, appendToExistingF
}
}
var datasToWrite [][]string
// 标题(列名)
var headers []string
if len(records) > 0 {
var columnHeaders []string
if len(headers) > 0 {
columnHeaders = headers[0]
} else {
for key := range records[0] {
headers = append(headers, key)
columnHeaders = append(columnHeaders, key)
}
// sort keys in alphabeta order
sort.Strings(columnHeaders)
}
// sort keys in alphabeta order
sort.Strings(headers)
// 追加模式不重复写字段名
var datasToWrite [][]string
if !appendToExistingFile {
datasToWrite = append(datasToWrite, headers)
datasToWrite = append(datasToWrite, columnHeaders)
}
for _, record := range records {
var row []string
for _, header := range headers {
row = append(row, fmt.Sprintf("%v", record[header]))
for _, h := range columnHeaders {
row = append(row, fmt.Sprintf("%v", record[h]))
}
datasToWrite = append(datasToWrite, row)
}
var sep rune
if len(delimiter) > 0 {
sep = delimiter[0]
} else {
sep = ','
}
return WriteCsvFile(filepath, datasToWrite, appendToExistingFile, sep)
return WriteCsvFile(filepath, datasToWrite, appendToExistingFile, delimiter)
}
// check if the value of map which to be written into csv is basic type.
@@ -814,8 +807,3 @@ func isCsvSupportedType(v interface{}) bool {
return false
}
}
// sort map by key in alphabeta order.
// func sortMap(records []map[string]any) []map[string]any {
// }

View File

@@ -339,7 +339,8 @@ func ExampleWriteMapsToCsv() {
{"Name": "Jim", "Age": "21", "Gender": "male"},
}
err := WriteMapsToCsv(csvFilePath, records, false, ';')
headers := []string{"Name", "Age", "Gender"}
err := WriteMapsToCsv(csvFilePath, records, false, ';', headers)
if err != nil {
log.Fatal(err)
@@ -350,7 +351,7 @@ func ExampleWriteMapsToCsv() {
fmt.Println(content)
// Output:
// [[Age Gender Name] [22 female Lili] [21 male Jim]]
// [[Name Age Gender] [Lili 22 female] [Jim 21 male]]
}
func ExampleWriteStringToFile() {

View File

@@ -397,7 +397,8 @@ func TestWriteMapsToCsv(t *testing.T) {
{"Name": "Jim", "Age": "21", "Gender": "male"},
}
err := WriteMapsToCsv(csvFilePath, records, false, ';')
headers := []string{"Name", "Age", "Gender"}
err := WriteMapsToCsv(csvFilePath, records, false, ';', headers)
assert.IsNil(err)
@@ -407,9 +408,9 @@ func TestWriteMapsToCsv(t *testing.T) {
assert.Equal(3, len(content))
assert.Equal(3, len(content[0]))
assert.Equal("22", content[1][0])
assert.Equal("female", content[1][1])
assert.Equal("Lili", content[1][2])
assert.Equal("Lili", content[1][0])
assert.Equal("22", content[1][1])
assert.Equal("female", content[1][2])
}
func TestWriteStringToFile(t *testing.T) {

View File

@@ -1,3 +1,3 @@
Age;Gender;Name
22;female;Lili
21;male;Jim
Name;Age;Gender
Lili;22;female
Jim;21;male
1 Name Age Gender
2 Lili 22 female
3 Jim 21 male

View File

@@ -1,3 +1,3 @@
Age;Gender;Name
22;female;Lili
21;male;Jim
Name;Age;Gender
Lili;22;female
Jim;21;male
1 Name Age Gender
2 Lili 22 female
3 Jim 21 male