Skip to content

Commit

Permalink
add readall, write , writeall to csv
Browse files Browse the repository at this point in the history
  • Loading branch information
DannyRavi committed Jun 13, 2023
1 parent 6b48fe0 commit 6cc4aa1
Showing 1 changed file with 248 additions and 1 deletion.
249 changes: 248 additions & 1 deletion content/chapter 4/4.11-csv.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,251 @@ func main() {

در این کد، تابع os.Open برای باز کردن پرونده CSV استفاده می‌شود. یک رابط csv.Reader ایجاد شده و یک رشته ساختارمند، پرونده CSV را می‌خواند. سپس با استفاده از یک حلقه، داده‌های جدولی چاپ می‌شود.

فراداده‌های CSV بسیار گسترده هستند و می‌توانند شامل شماره دسته، توضیحات، یادداشت‌های شخصی و غیره باشند. برای کار با این نوع داده‌ها، پکیج encoding/csv امکاناتی مانند تنظیمات csv.Reader را فراهم می‌کند، که در آن، می‌توانیم تنظیماتی مانند علامت‌گذاری مناسب فایل CSV و دیگر علامت‌گذاری‌ها را بهبود ببخشیم.
فراداده‌های CSV بسیار گسترده هستند و می‌توانند شامل شماره دسته، توضیحات، یادداشت‌های شخصی و غیره باشند. برای کار با این نوع داده‌ها، پکیج encoding/csv امکاناتی مانند تنظیمات csv.Reader را فراهم می‌کند، که در آن، می‌توانیم تنظیماتی مانند علامت‌گذاری مناسب فایل CSV و دیگر علامت‌گذاری‌ها را بهبود ببخشیم.

## 4.11.3 ReadAll فایل csv

تابع ReadAll تمام رکوردهای باقی مانده را از reader می خواند. هر رکورد یک قسمتی از fieldها است.

```csv
first_name,last_name,occupation
John,Doe,gardener
Lucy,Smith,teacher
Brian,Bethamy,programmer
```
نام این فایل users.csv است. خط اول نام ستون ها هستند.


```go
package main

import (
"encoding/csv"
"fmt"
"log"
"os"
)

type User struct {
firstName string
lastName string
occupation string
}

func main() {

records, err := readData("users.csv")

if err != nil {
log.Fatal(err)
}

for _, record := range records {

user := User{
firstName: record[0],
lastName: record[1],
occupation: record[2],
}

fmt.Printf("%s %s is a %s\n", user.firstName, user.lastName,
user.occupation)
}
}

func readData(fileName string) ([][]string, error) {

f, err := os.Open(fileName)

if err != nil {
return [][]string{}, err
}

defer f.Close()

r := csv.NewReader(f)

// skip first line
if _, err := r.Read(); err != nil {
return [][]string{}, err
}

records, err := r.ReadAll()

if err != nil {
return [][]string{}, err
}

return records, nil
}
```

اسم فایل بالا read_all.go می‌باشد و این مثال فایل users.csv را می خواند. هر line به یک `User` type را بر می‌گرداند.

```go
// skip first line
if _, err := r.Read(); err != nil {
return [][]string{}, err
}
```
در اینجا از خط اول که شامل نام ستون هاست می گذریم.

```go
records, err := r.ReadAll()
```
در نهایت همه رکوردها را یک جا با ReadAll دریافت می کنیم.

```shell
$ go run read_all.go
John Doe is a gardener
Lucy Smith is a teacher
Brian Bethamy is a programmer
```

## 4.11.4 delimiter CSV دلخواه

علیرغم نام CSV ، CSV ممکن است دارای جداکننده های دیگری غیر از کاما باشد. این به دلیل استاندارد نبودن قالب CSV است.

```csv
# user.csv
# this is users.csv file
John;Doe;gardener
Lucy;Smith;teacher
Brian;Bethamy;programmer
```
در فایل users.csv فیلدها با نقطه ویرگول از هم جدا شده اند. این فایل حاوی یک comment نیز می‌باشد.

```go
//different_delimiter.go//

package main

import (
"encoding/csv"
"fmt"
"log"
"os"
)

func main() {

f, err := os.Open("users.csv")

if err != nil {

log.Fatal(err)
}

r := csv.NewReader(f)
r.Comma = ';'
r.Comment = '#'

records, err := r.ReadAll()

if err != nil {
log.Fatal(err)
}

fmt.Print(records)
}
```
این مثال تمام داده های این فایل را می خواند.

```go
r := csv.NewReader(f)
r.Comma = ';'
r.Comment = '#'
```
در اینجا separator و کاراکتر comment را تنظیم می کنیم تا package بداند چگونه فایل را parse یا تجریه تحلیل کند.


## 4.11.5 نوشتن CSV

تابع Write یک رکورد CSV را برای writer می نویسد. رکورد برشی از strings است که هر string یک فیلد است. write ها buffer شده هستند، بنابراین باید Flush فراخوانی شود تا اطمینان حاصل شود که رکورد برای writer اصلی نوشته شده است.

```go
//write_fun.go//
package main

import (
"encoding/csv"
"log"
"os"
)

func main() {

records := [][]string{
{"first_name", "last_name", "occupation"},
{"John", "Doe", "gardener"},
{"Lucy", "Smith", "teacher"},
{"Brian", "Bethamy", "programmer"},
}

f, err := os.Create("users.csv")
defer f.Close()

if err != nil {

log.Fatalln("failed to open file", err)
}

w := csv.NewWriter(f)
defer w.Flush()

for _, record := range records {
if err := w.Write(record); err != nil {
log.Fatalln("error writing record to file", err)
}
}
}
```

در مثال بالا، چند رکورد را با تابع Write در فایل users.csv نوشتیم.


## 4.11.6 نوشتن WriteAll CSV

تابع WriteAll چندین رکورد CSV را با استفاده از Write برای writer می‌نویسد و سپس Flush را فراخوانی می‌کند.

```go

//write_all.go//

package main

import (
"encoding/csv"
"log"
"os"
)

func main() {

records := [][]string{
{"first_name", "last_name", "occupation"},
{"John", "Doe", "gardener"},
{"Lucy", "Smith", "teacher"},
{"Brian", "Bethamy", "programmer"},
}

f, err := os.Create("users.csv")
defer f.Close()

if err != nil {

log.Fatalln("failed to open file", err)
}

w := csv.NewWriter(f)
err = w.WriteAll(records) // calls Flush internally

if err != nil {
log.Fatal(err)
}
}
```

در نهایت ما چند رکورد را در یک لحظه با WriteAll می نویسیم.

0 comments on commit 6cc4aa1

Please sign in to comment.