csv를 Go로 조작하는 기본 지식

16199 단어 Gogolangcsvtech
csv 파일을 Golang으로 만지려면 "encoding/csv"를 사용하십시오.
https://pkg.go.dev/encoding/csv
다른 표준 라이브러리 os를 사용하여 파일을 엽니다.

원래 csv 파일은?


실무에 들어간 후 csv 파일을 처음 접했는데 뭔지 몰라서 먼저 설명해 드릴게요.
csv는 Commer Separated Value의 약자로 그대로 유지된다는 뜻이다.쉼표 구분 파일이라고도 한다.파일 확장자는 입니다.csv.
예를 들어 우체국의 우편번호 데이터를 보면 실제로 csv 파일을 받을 수 있다.
https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html
csv 파일을 Numbers와 Excel 등으로 보면 다음과 같은 표 형식으로 표시할 수 있다.

csv 파일
csv 파일은 프로그래밍 언어와 함께 사용할 수 있기 때문에 호환성과 용도에 맞게 사용할 수 있고 통용성이 높아 매우 편리하다.

Golang으로 csv 파일 읽기


Read 또는 ReadAll을 사용하여 파일을 읽을 수 있습니다.
package main

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

func main() {
  file, err := os.Open("28HYOGO.CSV") // 先ほど入手した郵便番号データをos.Openで開く
  if err != nil {
    log.Fatal(err)
  }
  defer file.Close()
  
  r := csv.NewReader(file)
  rows, err := r.ReadAll() // csvを一度に全て読み込む
  if err != nil {
    log.Fatal(err)
  }
  
  // [][]stringなのでループする
  for _, v := range rows {
    fmt.Println(v)
  }
}
Print를 사용하여 표준 출력을 시도해 보면 다음과 같이 표시됩니다.(SHIFT-JIS 형식이기 때문에 맥에서 봤을 때 난사이즈예요. 잠시 틀어놓을게요.)
mattn선생님께서 저에게 댓글을 달아주시고 상술한 취소선 부분을 지적하셨습니다.감사합니다.mattn씨의 보도는여기.
일본에서 CSV 파일은 일반적으로 ShiftJIS에서 자주 인코딩됩니다.Go 언어의 내부 인코딩은 UTF-8이므로 ShiftJIS의 CSV 파일을 읽으면 코드가 흐려집니다.
[28586 66967 6696746 ˮ��޹� ж���ݼݵݾ���� ��� ���Ɍ� �����S�V���� �˓c 0 0 0 0 0 0]
[28586 66968 6696821 ˮ��޹� ж���ݼݵݾ���� � ���Ɍ� �����S�V���� �� 0 0 0 0 0 0]
[28586 66967 6696744 ˮ��޹� ж���ݼݵݾ���� ֳ�� ���Ɍ� �����S�V���� �p�y 0 0 0 0 0 0]
[28586 66967 6696716 ˮ��޹� ж���ݼݵݾ���� ��� ���Ɍ� �����S�V���� �a�c 0 0 0 0 0 0]
...
...
또한 csv를 읽을 때 한 번에 모두 읽는 방법(csv.ReadAll)과 한 줄씩 읽는 방법(csv.Read)이 있다.
Read를 사용할 때는 다음과 같습니다.
// 省略

  r := csv.NewReader(file) // csv.NewReaderを使ってcsvを読み込む
  
  // []stringなのでループする
  for {
    row, err := r.Read() // csvを1行ずつ読み込む
      if err == io.EOF {
        break // 読み込むべきデータが残っていない場合,Readはnil, io.EOFを返すため、ここでループを抜ける
      }
    fmt.Println(row)
  }
}
이렇게 해도 같은 결과를 얻을 수 있다.

csv 파일에 Golang 쓰기


package main

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

func main() {
	records := [][]string{
		[]string{"名前", "年齢", "出身地", "性別"},
		[]string{"山本", "24", "兵庫", "男"},
		[]string{"鈴木", "29", "神奈川", "女"},
		[]string{"佐藤", "27", "鹿児島", "男"},
	}

	f, err := os.Create("test.csv") // 書き込む先のファイル
	if err != nil {
		fmt.Println(err)
	}

	w := csv.NewWriter(f)
	w.WriteAll(records) // 一度にすべて書き込む
}
이 동작을 실행하면 실행 파일과 같은 디렉터리에서test를 실행합니다.csv 이 파일이 만들어져서 리코더의 내용이 기록될 것 같습니다.
또한 Write 쓰기 방법은 다음과 같습니다.
package main

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

func main() {
	records := [][]string{
		[]string{"名前", "年齢", "出身地", "性別"},
		[]string{"山本", "24", "兵庫", "男"},
		[]string{"鈴木", "29", "神奈川", "女"},
		[]string{"佐藤", "27", "鹿児島", "男"},
	}

	f, err := os.Create("test.csv")
	if err != nil {
		fmt.Println(err)
	}

	w := csv.NewWriter(f)

	for _, record := range records {
		if err := w.Write(record); err != nil {
			fmt.Println(err)
		}
	}
	w.Flush() // バッファに残っているデータを書き込む
}

총결산


표준 프로그램 라이브러리를 사용하면 csv 파일을 간단하게 조작할 수 있습니다.
BOM에 부착해야 하는 csv 파일도 있고 문자 코드가 UTF16 등으로 변경되었을 때 이것에 대해 다시 기사를 쓰고 싶습니다.

좋은 웹페이지 즐겨찾기