0

0

丢失记录之谜:在 Go 中调试 JSON 到 CSV 的转换

DDD

DDD

发布时间:2024-10-31 10:21:01

|

695人浏览过

|

来源于dev.to

转载

丢失记录之谜:在 go 中调试 json 到 csv 的转换

在我的一个业余项目中构建数据转换实用程序期间,我需要将 json 格式的文件转换为 csv 格式。我遇到了一个棘手的问题,花了近一个小时进行调试才确定根本原因。

这个过程应该很简单,包括三个主要步骤:

  1. 打开 json 文件
  2. 将该 json 文件解析为特定的结构
  3. 将数据写入 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条记录,而且最后一条记录也不完整。

illostrationAI
illostrationAI

AI插画生成,lowpoly、3D、矢量、logo、像素风、皮克斯等风格

下载
65030 adam@gmail.com, gmail, 2023-03-17 15:04:05.000
65031 jac@hotmail.com, hotmail, 2023-03-17 15:04:05.000
65032 nancy@xyz.com, 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。

就这些了!我希望你喜欢阅读。我倾向于从错误中学到很多东西——无论是我的还是别人的。即使没有立即解决办法,发现错误的方法也可以帮助我避免将来陷入类似的陷阱。这就是为什么我想分享这个经验!

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

418

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

535

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

25

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

6

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

25

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号