Go언어로 CSV파일을 한줄씩 읽어오는 방법입니다.
파일을 메모리에 올려서 한 번에 처리하면 파일이 큰 경우에는 메모리를 다 쓰기 때문에 스왑을 사용해서 문제를 만듭니다.
조금 느리더라도 파일은 1줄씩 읽거나 조금씩 읽어야 합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
// csv.gz 파일에서 데이터를 한 줄씩 읽어오는 방법 package main import ( "compress/gzip" "encoding/csv" "fmt" "io" "log" "os" "strings" ) func main() { file, err := os.Open("product_titles.csv.gz") if err != nil { log.Fatal(err) } defer file.Close() gzipReader, err := gzip.NewReader(file) if err != nil { log.Fatal(err) } defer gzipReader.Close() csvReader := csv.NewReader(gzipReader) csvReader.Comma = '\t' csvReader.FieldsPerRecord = -1 for { record, err := csvReader.Read() if err == io.EOF { break } if err != nil { log.Fatal(err) } // 첫번째 필드만 꺼내오기 fmt.Println("record count:", len(record)) if len(record) < 1 { log.Println("record is empty") continue } field1 := strings.Trim(record[0], " ") if len(field1) < 1 { log.Println("field1 is empty") continue } fmt.Println("field1:", field1) } } |