CSV(Comma-Separated Values)
CSV(Comma-Separated Values,逗号分隔值)是一种简单的文本文件格式,用于存储表格数据。CSV 文件以纯文本形式表示数据,每行代表一条记录,每条记录的字段由逗号分隔。由于其简单和易于读取的特性,CSV 广泛用于数据交换、存储和分析。
1. CSV 文件格式
CSV 文件的基本格式如下:
一行一条记录,字段用逗号(
,)分隔:name,age,city John,30,New York Jane,25,Los Angeles第一行通常是字段名称(标题行),不强制。例如:
name,age,city John,30,New York Jane,25,Los Angeles字段内容包含逗号、换行符或引号时,整个字段用双引号括起来。例如:
name,age,city "John, Doe",30,"New York"字段本身含引号时,再加一个引号转义。例如:
name,age,city "John ""Johnny"" Doe",30,"New York"每行以换行符(
\n)结尾,不同操作系统可能用\r\n或\n。
2. CSV 文件的优点和缺点
优点:
- 格式简单,大多数编程语言和工具都有现成支持。
- Excel、Google Sheets 等电子表格软件能直接打开,纯文本也便于传输和编辑。
缺点:
- 没有统一标准,不同实现对引号、换行的处理不一致,容易出兼容性问题。
- 内容全部是字符串,类型信息要靠上层自己约定,嵌套结构也放不进去。
- 字段里含逗号、引号、换行时,解析要额外做引号处理。
3. CSV 的应用
- 数据交换:系统之间导数据,或给数据库、电子表格做导入导出。
- 日志:结构化数据写成文本日志,事后用文本工具就能处理。
- 数据分析:常作为分析工具的数据源。
4. CSV 处理示例(Go 语言)
在 Go 语言中,可以使用 encoding/csv 包来读取和写入 CSV 文件。以下是处理 CSV 文件的示例代码:
CSV 文件读取示例:
go
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
// 打开 CSV 文件
file, err := os.Open("data.csv")
if err != nil {
fmt.Println("打开文件失败:", err)
return
}
defer file.Close()
// 创建 CSV 读取器
reader := csv.NewReader(file)
// 读取所有记录
records, err := reader.ReadAll()
if err != nil {
fmt.Println("读取文件失败:", err)
return
}
// 打印记录
for _, record := range records {
fmt.Println(record)
}
}CSV 文件写入示例:
go
package main
import (
"encoding/csv"
"fmt"
"os"
)
func main() {
// 创建或打开 CSV 文件
file, err := os.Create("output.csv")
if err != nil {
fmt.Println("创建文件失败:", err)
return
}
defer file.Close()
// 创建 CSV 写入器
writer := csv.NewWriter(file)
// 写入记录
records := [][]string{
{"name", "age", "city"},
{"John", "30", "New York"},
{"Jane", "25", "Los Angeles"},
}
err = writer.WriteAll(records)
if err != nil {
fmt.Println("写入文件失败:", err)
return
}
fmt.Println("CSV 文件写入成功")
}5. CSV 文件处理中的常见问题
字段内容中的特殊字符:
- 处理字段内容中的逗号、引号和换行符时,需要正确地用引号括起来并转义。
数据类型的转换:
- CSV 文件中所有数据都以字符串格式存储,在处理数据时可能需要转换为适当的数据类型(如整数、浮点数)。
处理大型 CSV 文件:
- 对于非常大的 CSV 文件,建议使用流式读取的方法来避免一次性加载整个文件到内存中。
总结
Go 处理 CSV 用 encoding/csv 包:读取走 Reader 的 ReadAll,写入走 Writer 的 WriteAll;文件大时改用流式读取,避免整个文件进内存。