【发布时间】: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