哈喽!大家好,很高兴又见面了,我是GOLANG的一名作者,今天由我给大家带来一篇
《丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换》,本文主要会讲到
等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!,
,在我的一个业余项目中构建数据转换实用程序期间,我需要将 json 格式的文件转换为 csv 格式。我遇到了一个棘手的问题,花了近一个小时进行调试才确定根本原因。,这个过程应该很简单,包括三个主要步骤:,代码很简单:创建一个具有特定名称格式的新文件,推迟其关闭,初始化 csv 编写器,然后开始写入该文件。超级简单吧?,步骤 1 和 2 效果很好,所以省略了。让我们将焦点转移到步骤 3,其中发生了意外的情况:csv 输出仅包含 65,032 条记录,这意味着缺少 310 条记录。,为了排除故障,我尝试了仅使用 7 个 json 元素(而不是 65,032 个)的代码。令人惊讶的是,csv 文件中根本没有写入任何内容!,我仔细检查了一些简单的错误,比如缺少文件关闭,但一切看起来都很好。然后我重试了完整的 65,032 个元素,希望能获得更多线索。这时我发现不仅少了310条记录,而且最后一条记录也不完整。
,这是进步——我现在可以缩小问题范围并专注于 w.write(newrecord(domain, elm)),特别是 w.write(…) 方法。我查了文档,找到了原因:,我忘记调用 w.flush()。这是有道理的,因为从性能角度来看,csv 编写器会缓冲写入,而不是每次调用 w.write() 时执行 i/o 操作。通过缓冲数据,它减少了 i/o 负载,并在最后调用 w.flush() 确保缓冲区中的任何剩余数据都写入文件。,这是更正后的代码:
,为了确认,我检查了 bufio.go 源代码,发现默认缓冲区大小为 4k。在 writerune(…) 方法中,您将看到每当缓冲区达到其限制时它就会调用 flush。,就这些了!我希望你喜欢阅读。我倾向于从错误中学到很多东西——无论是我的还是别人的。即使没有立即解决办法,发现错误的方法也可以帮助我避免将来陷入类似的陷阱。这就是为什么我想分享这个经验!,到这里,我们也就讲完了《丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注GOLANG公众号,带你了解更多关于的知识点!,哈喽!大家好,很高兴又见面了,我是GOLANG的一名作者,今天由我给大家带来一篇
《丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换》,本文主要会讲到
等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!,
当前位置: > > > > 丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换
丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换
来源:dev.to
2024-11-06 21:51:57
0浏览
收藏
哈喽!大家好,很高兴又见面了,我是GOLANG的一名作者,今天由我给大家带来一篇《丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换》,本文主要会讲到等等知识点,希望大家一起学习进步,也欢迎大家关注、点赞、收藏、转发! 下面就一起来看看吧!
在我的一个业余项目中构建数据转换实用程序期间,我需要将 json 格式的文件转换为 csv 格式。我遇到了一个棘手的问题,花了近一个小时进行调试才确定根本原因。
这个过程应该很简单,包括三个主要步骤:
- 打开 json 文件
- 将该 json 文件解析为特定的结构
- 将数据写入 csv 文件 首先,让您了解一下,json 是一个包含 65,342 个元素的数组。
func jsontocsv(data *srcsheet) { // create file name in a format like "email_241030172647.csv" (email_yymmddhhmmss.csv) fname := filename() // create file f, err := os.create(fname) if err != nil { log.println("unable to create file", err) return } defer f.close() // closing to release resources w := csv.newwriter(f) // initializing csv writer // add header header := []string{"email", "provider", "added_on"} if err = w.write(header); err != nil { log.println("unable to write header", err) return } count := 0 for domain, elm := range data.email { if err := w.write(newrecord(domain, elm)); err != nil { log.println("unable to add new record", domain, err) return } else { count++ } } log.println("number of records written =", count) } func newrecord(email string, e *srcelements) []string { if e == nil { return nil } dbformat := "2006-01-02 15:04:05.000" addedon := time.now().utc().format(dbformat) r := []string{email, e.provider, addedon} return r }
代码很简单:创建一个具有特定名称格式的新文件,推迟其关闭,初始化 csv 编写器,然后开始写入该文件。超级简单吧?
步骤 1 和 2 效果很好,所以省略了。让我们将焦点转移到步骤 3,其中发生了意外的情况:csv 输出仅包含 65,032 条记录,这意味着缺少 310 条记录。
为了排除故障,我尝试了仅使用 7 个 json 元素(而不是 65,032 个)的代码。令人惊讶的是,csv 文件中根本没有写入任何内容!
我仔细检查了一些简单的错误,比如缺少文件关闭,但一切看起来都很好。然后我重试了完整的 65,032 个元素,希望能获得更多线索。这时我发现不仅少了310条记录,而且最后一条记录也不完整。
65030 [email protected], gmail, 2023-03-17 15:04:05.000 65031 [email protected], hotmail, 2023-03-17 15:04:05.000 65032 [email protected], hotmail, 2023-03-
这是进步——我现在可以缩小问题范围并专注于 w.write(newrecord(domain, elm)),特别是 w.write(…) 方法。我查了文档,找到了原因:
…写入会被缓冲,因此最终必须调用 [writer.flush] 以确保记录写入底层 io.writer …
我忘记调用 w.flush()。这是有道理的,因为从性能角度来看,csv 编写器会缓冲写入,而不是每次调用 w.write() 时执行 i/o 操作。通过缓冲数据,它减少了 i/o 负载,并在最后调用 w.flush() 确保缓冲区中的任何剩余数据都写入文件。
这是更正后的代码:
... f, err := os.Create(fName) if err != nil { log.Println("Unable to create file", err) return } defer f.Close() w := csv.NewWriter(f) defer w.Flush() // Add header header := []string{"email", "provider", "added_on"} ...
为了确认,我检查了 bufio.go 源代码,发现默认缓冲区大小为 4k。在 writerune(…) 方法中,您将看到每当缓冲区达到其限制时它就会调用 flush。
就这些了!我希望你喜欢阅读。我倾向于从错误中学到很多东西——无论是我的还是别人的。即使没有立即解决办法,发现错误的方法也可以帮助我避免将来陷入类似的陷阱。这就是为什么我想分享这个经验!
到这里,我们也就讲完了《丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注GOLANG公众号,带你了解更多关于的知识点!
版本声明 本文转载于:dev.to 如有侵犯,请联系 删除
- 分片上传中后端为什么使用“blob”作为文件名?
- win10怎么设置平板模式下自动隐藏任务栏