From 4afc8389375275616aba8faa23ac929db9eb56d8 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 1 Jan 2024 17:40:32 +0800 Subject: [PATCH] doc: add doc for WriteMapsToCsv --- docs/api/packages/fileutil.md | 51 +++++++++++++++++++++++++++++-- docs/en/api/packages/fileutil.md | 52 ++++++++++++++++++++++++++++++-- fileutil/file.go | 15 ++++++--- fileutil/file_example_test.go | 22 ++++++++++++++ fileutil/file_test.go | 24 ++++++++++++++- fileutil/testdata/test1.csv | 1 + fileutil/testdata/test2.csv | 1 + fileutil/testdata/test3.csv | 3 ++ fileutil/testdata/text.txt | 0 9 files changed, 159 insertions(+), 10 deletions(-) create mode 100644 fileutil/testdata/test3.csv create mode 100644 fileutil/testdata/text.txt diff --git a/docs/api/packages/fileutil.md b/docs/api/packages/fileutil.md index 31fb43f..4caa5e5 100644 --- a/docs/api/packages/fileutil.md +++ b/docs/api/packages/fileutil.md @@ -669,7 +669,7 @@ func main() { 函数签名: ```go -func ReadCsvFile(filepath string) ([][]string, error) +func ReadCsvFile(filepath string, delimiter ...rune) ([][]string, error) ``` 示例:[运行](https://go.dev/play/p/OExTkhGEd3_u) @@ -701,7 +701,7 @@ func main() { 函数签名: ```go -func WriteCsvFile(filepath string, records [][]string, append bool) error +func WriteCsvFile(filepath string, records [][]string, append bool, delimiter ...rune) error ``` 示例:[运行](https://go.dev/play/p/dAXm58Q5U1o) @@ -743,6 +743,53 @@ func main() { } ``` +### WriteMapsToCsv + +

将map切片写入csv文件中。

+ +函数签名: + +```go +func WriteMapsToCsv(filepath string, records []map[string]string, append_to_existing_file bool, delimiter ...rune) error +``` + +示例: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + fpath := "./test.csv" + fileutil.CreateFile(fpath) + + f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777) + defer f.Close() + + records := []map[string]string{ + {"Name": "Lili", "Age": "22", "gender": "female"}, + {"Name": "Jim", "Age": "21", "gender": "male"}, + } + + err := WriteMapsToCsv(csvFilePath, records, false, ';') + + if err != nil { + log.Fatal(err) + } + + content, err := ReadCsvFile(csvFilePath, ';') + + fmt.Println(content) + + // Output: + // [[Name Age gender] [Lili 22 female] [Jim 21 male]] +} +``` + ### WriteBytesToFile

将bytes写入文件。

diff --git a/docs/en/api/packages/fileutil.md b/docs/en/api/packages/fileutil.md index 30c3358..c2c506a 100644 --- a/docs/en/api/packages/fileutil.md +++ b/docs/en/api/packages/fileutil.md @@ -45,6 +45,7 @@ import ( - [Sha](#Sha) - [ReadCsvFile](#ReadCsvFile) - [WriteCsvFile](#WriteCsvFile) +- [WriteMapsToCsv](#WriteMapsToCsv) - [WriteStringToFile](#WriteStringToFile) - [WriteBytesToFile](#WriteBytesToFile) - [ReadFile](#ReadFile) @@ -669,7 +670,7 @@ func main() { Signature: ```go -func ReadCsvFile(filepath string) ([][]string, error) +func ReadCsvFile(filepath string, delimiter ...rune) ([][]string, error) ``` Example:[Run](https://go.dev/play/p/OExTkhGEd3_u) @@ -701,7 +702,7 @@ func main() { Signature: ```go -func WriteCsvFile(filepath string, records [][]string, append bool) error +func WriteCsvFile(filepath string, records [][]string, append bool, delimiter ...rune) error ``` Example:[Run](https://go.dev/play/p/dAXm58Q5U1o) @@ -743,6 +744,53 @@ func main() { } ``` +### WriteMapsToCsv + +

Write slice of map to csv file.

+ +Signature: + +```go +func WriteMapsToCsv(filepath string, records []map[string]string, append_to_existing_file bool, delimiter ...rune) error +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/fileutil" +) + +func main() { + fpath := "./test.csv" + fileutil.CreateFile(fpath) + + f, _ := os.OpenFile(fpath, os.O_WRONLY|os.O_TRUNC, 0777) + defer f.Close() + + records := []map[string]string{ + {"Name": "Lili", "Age": "22", "gender": "female"}, + {"Name": "Jim", "Age": "21", "gender": "male"}, + } + + err := WriteMapsToCsv(csvFilePath, records, false, ';') + + if err != nil { + log.Fatal(err) + } + + content, err := ReadCsvFile(csvFilePath, ';') + + fmt.Println(content) + + // Output: + // [[Name Age gender] [Lili 22 female] [Jim 21 male]] +} +``` + ### WriteBytesToFile

Writes bytes to target file.

diff --git a/fileutil/file.go b/fileutil/file.go index 3328d45..723abda 100644 --- a/fileutil/file.go +++ b/fileutil/file.go @@ -628,15 +628,19 @@ func Sha(filepath string, shaType ...int) (string, error) { // ReadCsvFile read file content into slice. // Play: https://go.dev/play/p/OExTkhGEd3_u -func ReadCsvFile(filepath string) ([][]string, error) { +func ReadCsvFile(filepath string, delimiter ...rune) ([][]string, error) { f, err := os.Open(filepath) if err != nil { return nil, err } defer f.Close() - csvReader := csv.NewReader(f) - records, err := csvReader.ReadAll() + reader := csv.NewReader(f) + if len(delimiter) > 0 { + reader.Comma = delimiter[0] + } + + records, err := reader.ReadAll() if err != nil { return nil, err } @@ -748,8 +752,9 @@ func escapeCSVField(field string, delimiter rune) string { return escapedField } -// map切片写入csv文件中 -func WriteMapsToCSV(filepath string, records []map[string]string, append_to_existing_file bool, delimiter ...rune) error { +// WriteMapsToCsv write slice of map to csv file. +// Play: todo +func WriteMapsToCsv(filepath string, records []map[string]string, append_to_existing_file bool, delimiter ...rune) error { var datas_to_write [][]string // 标题(列名) var headers []string diff --git a/fileutil/file_example_test.go b/fileutil/file_example_test.go index 3f08528..a0e7e33 100644 --- a/fileutil/file_example_test.go +++ b/fileutil/file_example_test.go @@ -3,6 +3,7 @@ package fileutil import ( "fmt" "io" + "log" "os" ) @@ -331,6 +332,27 @@ func ExampleWriteCsvFile() { // [[Lili 22 female] [Jim 21 male]] } +func ExampleWriteMapsToCsv() { + csvFilePath := "./testdata/test3.csv" + records := []map[string]string{ + {"Name": "Lili", "Age": "22", "gender": "female"}, + {"Name": "Jim", "Age": "21", "gender": "male"}, + } + + err := WriteMapsToCsv(csvFilePath, records, false, ';') + + if err != nil { + log.Fatal(err) + } + + content, err := ReadCsvFile(csvFilePath, ';') + + fmt.Println(content) + + // Output: + // [[Name Age gender] [Lili 22 female] [Jim 21 male]] +} + func ExampleWriteStringToFile() { filepath := "./test.txt" diff --git a/fileutil/file_test.go b/fileutil/file_test.go index 5bf13df..0e877be 100644 --- a/fileutil/file_test.go +++ b/fileutil/file_test.go @@ -379,11 +379,33 @@ func TestWriteCsvFile(t *testing.T) { assert.Equal(2, len(readContent)) assert.Equal(3, len(readContent[0])) - assert.Equal("Lili", content[0][0]) + assert.Equal("Lili", readContent[0][0]) // RemoveFile(csvFilePath) } +func TestWriteMapsToCsv(t *testing.T) { + assert := internal.NewAssert(t, "TestWriteMapsToCSV") + + csvFilePath := "./testdata/test3.csv" + records := []map[string]string{ + {"Name": "Lili", "Age": "22", "gender": "female"}, + {"Name": "Jim", "Age": "21", "gender": "male"}, + } + + err := WriteMapsToCsv(csvFilePath, records, false, ';') + + assert.IsNil(err) + + content, err := ReadCsvFile(csvFilePath, ';') + + assert.IsNil(err) + + assert.Equal(3, len(content)) + assert.Equal(3, len(content[0])) + assert.Equal("Lili", content[1][0]) +} + func TestWriteStringToFile(t *testing.T) { assert := internal.NewAssert(t, "TestWriteStringToFile") diff --git a/fileutil/testdata/test1.csv b/fileutil/testdata/test1.csv index ce44349..a3524ee 100644 --- a/fileutil/testdata/test1.csv +++ b/fileutil/testdata/test1.csv @@ -1,3 +1,4 @@ Lili,22,female Jim,21,male + diff --git a/fileutil/testdata/test2.csv b/fileutil/testdata/test2.csv index ce44349..a3524ee 100644 --- a/fileutil/testdata/test2.csv +++ b/fileutil/testdata/test2.csv @@ -1,3 +1,4 @@ Lili,22,female Jim,21,male + diff --git a/fileutil/testdata/test3.csv b/fileutil/testdata/test3.csv new file mode 100644 index 0000000..875d813 --- /dev/null +++ b/fileutil/testdata/test3.csv @@ -0,0 +1,3 @@ +Name;Age;gender +Lili;22;female +Jim;21;male diff --git a/fileutil/testdata/text.txt b/fileutil/testdata/text.txt new file mode 100644 index 0000000..e69de29