2017-09-19 17 views
1

golangでgoogle apiからcsvファイルを解析しています。ファイルはutf-16でエンコードされています。下のコードは1つのレコードを読み込み(ヘッダーをスキップ)私はこのような出力は奇妙です: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 
     } 
    } 
} 
関連する問題