2017-09-19 11 views
1

golang으로 google api에서 csv 파일을 구문 분석하고 있는데 파일이 utf-16으로 인코딩되어 있습니다. 아래의 코드는 하나의 레코드 (헤더 건너 뛰기)를 읽고 레코드를 인쇄하려고 시도하지만 코드는 나 같은 출력이 이상해 :이상한 출력으로 CSV 파일을 구문 분석 할 때

, v=/09/20 00:35:42 k=Smartfren Andromax AD681H 

내가 아마 UTF-16 인코딩과 관련된 추측하지만, 세부 사항을 모르는, 여기에 코드입니다 : 주요 패키지

import (
    "encoding/csv" 
    "io" 
    "log" 
    "net/http" 
    "strings" 
) 

var url = "http://storage.googleapis.com/play_public/supported_devices.csv" 

func main() { 

    resp, err := http.Get(url) 
    if err != nil { 
     return 
    } 
    defer resp.Body.Close() 

    r := csv.NewReader(resp.Body) 
    r.LazyQuotes = true 
    r.FieldsPerRecord = -1 
    // skip header 
    r.Read() 

    m := make(map[string]string) 
    for { 
     record, err := r.Read() 
     if err == io.EOF { 
      break 
     } 
     if err != nil { 
      log.Println(err) 
      continue 
     } 
     if len(record) >= 4 { 
      m[strings.TrimSpace(record[3])] = strings.TrimSpace(record[1]) 
      for k, v := range m { 
       log.Printf("k=%s, v=%s\n", k, v) 
      } 
      break 
     } 
    } 
} 

답변

3

예상대로 입력 데이터를 UTF-16 인코딩 된 스트림에서 UTF-8 인코딩 된 스트림으로 변환해야합니다 사람. Go 하위 저장소 패키지를 사용하여 수행 할 수 있습니다. golang.org/x/text/encoding/unicode :

package main 

import (
    "encoding/csv" 
    "io" 
    "log" 
    "net/http" 
    "strings" 

    "golang.org/x/text/encoding/unicode" 
) 

var url = "http://storage.googleapis.com/play_public/supported_devices.csv" 

func main() { 

    resp, err := http.Get(url) 
    if err != nil { 
     return 
    } 
    defer resp.Body.Close() 

    dec := unicode.UTF16(unicode.LittleEndian, unicode.UseBOM).NewDecoder() 
    reader := dec.Reader(resp.Body) 

    r := csv.NewReader(reader) 
    r.LazyQuotes = true 
    r.FieldsPerRecord = -1 
    // skip header 
    r.Read() 

    m := make(map[string]string) 
    for { 
     record, err := r.Read() 
     if err == io.EOF { 
      break 
     } 
     if err != nil { 
      log.Println(err) 
      continue 
     } 
     if len(record) >= 4 { 
      m[strings.TrimSpace(record[3])] = strings.TrimSpace(record[1]) 
      for k, v := range m { 
       log.Printf("k=%s, v=%s\n", k, v) 
      } 
      break 
     } 
    } 
}