0

0

使用 Go 语言生成大 CSV 文件

DDD

DDD

发布时间:2025-10-04 11:19:48

|

187人浏览过

|

来源于php中文网

原创

使用 go 语言生成大 csv 文件

本文旨在提供一个使用 Go 语言高效生成大型 CSV 文件的实用教程。我们将介绍如何利用 bufio 包进行缓冲写入,以及如何使用随机数据模拟真实场景,最终生成指定大小的 CSV 文件。通过本文,你将学会如何生成包含随机数据(如前缀、用户名、时间戳和数字)的 10GB CSV 文件,并了解一些性能优化的技巧。

生成大型 CSV 文件

在进行大数据处理和性能测试时,生成大型测试文件是一个常见的需求。本教程将演示如何使用 Go 语言高效地生成一个包含随机数据的 CSV 文件,大小约为 10GB。

代码实现

以下是一个完整的 Go 语言程序,用于生成指定格式的 CSV 文件:

package main

import (
    "bufio"
    "fmt"
    "math/rand"
    "os"
    "strconv"
    "time"
)

func main() {
    fileSize := int64(10e9) // 10GB
    filePath := "/tmp/largefile.csv" // 修改为你想要保存的文件路径
    f, err := os.Create(filePath)
    if err != nil {
        fmt.Println("Error creating file:", err)
        return
    }
    defer f.Close()

    w := bufio.NewWriter(f)
    defer w.Flush()

    prefixes := []string{"login", "logout", "register"}
    names := []string{"jbill", "dkennedy"}
    timeStart := time.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC)
    timeDur := timeStart.AddDate(1, 0, 0).Sub(timeStart)
    rand.Seed(time.Now().UnixNano())

    size := int64(0)
    for size < fileSize {
        // prefix:username:timestamp, number
        // login:jbill:2012/3/25, 1
        prefix := prefixes[rand.Intn(len(prefixes))]
        name := names[rand.Intn(len(names))]
        timestamp := timeStart.Add(time.Duration(rand.Int63n(int64(timeDur)))).Format("2006/01/02")
        number := strconv.Itoa(rand.Intn(100) + 1)
        line := fmt.Sprintf("%s:%s:%s, %s\n", prefix, name, timestamp, number)

        n, err := w.WriteString(line)
        if err != nil {
            fmt.Println("Error writing to file:", err)
            return
        }
        size += int64(n)
    }

    fmt.Printf("Successfully created file: %s, size: %d bytes\n", filePath, size)
}

代码解释:

网奇.NET网络商城系统
网奇.NET网络商城系统

系统优势: 1、 使用全新ASP.Net+c#和三层结构开发. 2、 可生成各类静态页面(html,htm,shtm,shtml和.aspx) 3、 管理后台风格模板自由选择,界面精美 4、 风格模板每月更新多套,还可按需定制 5、 独具的缓存技术加快网页浏览速度 6、 智能销售统计,图表分析 7、 集成国内各大统计系统 8、 多国语言支持,内置简体繁体和英语 9、 UTF-8编码,可使用于全球

下载
  1. 导入必要的包: 导入了 bufio 用于缓冲写入,fmt 用于格式化输出,math/rand 用于生成随机数,os 用于文件操作,strconv 用于字符串转换,以及 time 用于处理时间。
  2. 设置文件大小和路径: fileSize 定义了目标文件的大小(10GB),filePath 定义了文件的保存路径。 请根据实际需求修改 filePath。
  3. 创建文件: 使用 os.Create 创建文件。错误处理是必不可少的。使用 defer f.Close() 确保文件在使用完毕后会被关闭。
  4. 创建缓冲写入器: 使用 bufio.NewWriter 创建一个缓冲写入器,可以显著提高写入性能。同样,使用 defer w.Flush() 确保所有缓冲数据都被写入文件。
  5. 定义数据源: 定义了 prefixes 和 names 两个字符串数组,分别用于生成随机的前缀和用户名。timeStart 和 timeDur 用于生成随机的时间戳。
  6. 生成随机数据并写入文件: 循环生成随机数据,直到文件大小达到 fileSize。使用 rand.Intn 生成随机索引,从 prefixes 和 names 中选择随机值。使用 timeStart.Add 和 Format 生成随机时间戳。使用 strconv.Itoa 将随机数转换为字符串。使用 fmt.Sprintf 格式化字符串,并将数据写入文件。
  7. 错误处理: 在写入文件时,检查是否有错误发生。
  8. 输出完成信息: 程序完成后,输出文件的路径和大小。

编译和运行

将代码保存为 generate_csv.go,然后在命令行中执行以下命令编译并运行:

go run generate_csv.go

程序将在 /tmp/largefile.csv 创建一个 10GB 大小的 CSV 文件(如果路径存在且有写入权限)。

注意事项和优化

  • 文件路径: 确保程序有写入指定文件路径的权限。
  • 缓冲写入: 使用 bufio.Writer 可以显著提高写入性能,避免频繁的磁盘 I/O。
  • 随机数种子: 使用 rand.Seed(time.Now().UnixNano()) 初始化随机数生成器,以确保每次运行程序生成的随机数据不同。
  • 内存占用: 此代码在生成大文件时,内存占用相对较小,因为它是逐行写入文件的。
  • 错误处理: 在实际应用中,应该更全面地处理各种可能出现的错误。
  • 并发写入: 如果需要进一步提高性能,可以考虑使用 Goroutine 和 Channel 实现并发写入,但这会增加代码的复杂性。

总结

本教程提供了一个使用 Go 语言生成大型 CSV 文件的简单而有效的方法。通过使用 bufio 包进行缓冲写入,可以显著提高写入性能。在实际应用中,可以根据具体需求调整代码,例如修改文件大小、数据格式和数据源。记住,良好的错误处理和性能优化是编写高质量代码的关键。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

679

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

431

2024.06.27

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1491

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

622

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

551

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

566

2024.04.29

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 4.1万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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