【问题标题】:Golang read fixed width text file from S3Golang 从 S3 读取固定宽度的文本文件
【发布时间】:2020-07-09 05:25:57
【问题描述】:

我正在尝试使用this library 从 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... ]

所以我想知道我哪里出错了。是因为我传递了bufio.Reader 而不是io.Reader

编辑:

这是一些示例数据:

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

这些文件中没有列标题

【问题讨论】:

  • 需要导出结构中的字段(以大写字母开头),Unmarshal 才能使用它们。照原样,它没有找到任何字段(MailKey 除外),因此没有任何可解组的内容。
  • 不幸的是,将结构中的字段更改为大写字母没有效果。
  • 您应该显示示例数据,我们无法判断您的结构是否正确。除了导出的字段名外,您还需要确保名称与列名匹配,或者使用 struct 标签覆盖它们。
  • 已更新。这些文件没有列名
  • 您应该仔细检查fwencoder 文档,但我认为如果没有列标题它就无法工作。

标签: amazon-web-services go amazon-s3


【解决方案1】:

正如 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”之类的 here

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 2017-05-19
    • 1970-01-01
    相关资源
    最近更新 更多