首页 > 解决方案 > Golang 从 S3 读取固定宽度的文本文件

问题描述

我正在尝试使用此库从 S3 读取固定宽度的文件。它需要一个 io.Reader,到目前为止,这就是我所拥有的:

import (
    "bufio"
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/o1egl/fwencoder"
)

type leRecord struct {
    fullName       string
    firstName      string
    lastName       string
    primaryAddress string
    city           string
    state          string
    zipcode        string
    MailKey        string
}

func main() {
    getObjectReturnMaps("key", "bucket")

}

func getObjectReturnMaps(key, bucket string) {
    // Initialize an AWS session with configured credentials
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-1")},
    )
    if err != nil {
        panic(err)
    }

    // Define client
    s3Client := s3.New(sess)

    // Using the key, get the object from the bucket
    obj, err := s3Client.GetObject(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })
    if err != nil {
        fmt.Println(err)
    }

    // Read the body, parse it into variable
    var records []leRecord

    reader := bufio.NewReader(obj.Body)
    err = fwencoder.UnmarshalReader(reader, &records)
    if err != nil {
        fmt.Println("Error", err)
    }
    fmt.Println(records)
}

但是打印记录变量会返回空白:

[{       } {       } {       } {       } {       }......]

但如果我打印阅读器,它显然具有价值:

&{[32 32 88 10 84 82 69 65 68 87 69 76 76 32 32 68 65 78 73 69 76 32 32 82... ]

所以我想知道我哪里出错了。是因为我通过 abufio.Reader而不是 aio.Reader吗?

编辑:

以下是一些示例数据:

John                        Smith                       J                       123 Street Name                       SampleTown                       NY                       12345                       X
Jane                        Smith                       J                       456 Name Street                       Anywhere                         TX                       78901                       X

这些文件中没有列标题

标签: amazon-web-servicesgoamazon-s3

解决方案


正如 Marc 所评论的,fwencoder将文件的第一行视为标题。

https://github.com/o1egl/fwencoder/blob/8a2f1ab8210ee2018fd171ea1bea94eaa64d043c/decoder.go#L120

if !isHeaderParsed {
        isHeaderParsed = true
        headersLength = len(lineRunes)
        columns, err = parseHeaders(line, columnNames)
        if err != nil {
            return err
        }
        continue
    }

因此,如果您可以控制写入 s3 的文件,请尝试添加标题,或者如果您确定列的顺序,您可以依赖“encoding/csv”,例如这里


推荐阅读