Howto在Golang中将UUID RAW 16字节写入CSV



我有以下代码,可以尝试保存uuid raw 16字节(内部0x0a(到CSV格式

package main
import (
    "encoding/csv"
    "github.com/satori/go.uuid"
    "log"
    "os"
)
func main() {
    u, err := uuid.FromString("e1393c62-877a-4adc-8ffb-f1bf0a337c5f")
    if err != nil {
        log.Fatal(err)
    }
    csv_file, err := os.OpenFile("csv_wtf.csv", os.O_WRONLY|os.O_CREATE, 0644)
    if err != nil {
        log.Fatal(err)
    }
    s := string(u.Bytes())
    log.Printf("len(s)=%d",len(s))
    csv_writer := csv.NewWriter(csv_file)
    csv_writer.UseCRLF = false
    csv_writer.Write([]string{s})
    csv_writer.Flush()
    finfo, err := csv_file.Stat()
    if err != nil {
        log.Fatal(err)
    }
    log.Printf("size csv_wtf.csv = %d", finfo.Size())
    csv_file.Close()
}

此代码将数据输出到CSV,并添加额外的字节

2017/04/16 12:37:14 len(s)=16
2017/04/16 12:37:14 size csv_wtf.csv = 29

为什么编码/csv在遵循我的字符串范围时添加额外的字节(请参阅https://golang.org/src/src/encoding/csv/writer.go#l38,https://golang.org.org/src/encoding/csv/writer.go#l50和https://golang.org/src/encoding/csv/writer.go#l76(?

有人可以帮我找到不做奇怪转换的CSV软件包吗?

这是因为CSV格式不适合存储原始二进制数据,这不太可能是有效的UTF-8序列。

发生的事情是,当csv_writer.Writerange循环迭代字符串时,每次遇到无效的UTF-8序列时,符文r1等于65533,它编码为3个字节:0xef, 0xbf, 0xbd

说明性示例:

package main
import (
    "bytes"
    "fmt"
)
func main() {
    invalidString := string([]byte{0xff, 0xfe, 0xfd})
    var b bytes.Buffer
    for _, r := range invalidString {
        fmt.Printf("current rune: %vn", r)
        b.WriteRune(r)
    }
    fmt.Printf("total data: %vn", b.Bytes())
}

输出为:

current rune: 65533
current rune: 65533
current rune: 65533
total data: [239 191 189 239 191 189 239 191 189]

因此,您应该放弃CSV,而不是其他一些格式(适合存储二进制数据(,或以其字符串形式存储UUID。

相关内容

最新更新