在 Go 语言中处理 CSV 文件时,虽然标准库 encoding/csv 提供了高效的解析功能,但某些复杂场景(如非标准分隔符、含引号或转义字符的字段)可能需要结合正则表达式来实现更灵活的解析。本文将详细介绍如何使用正则表达式在 Go 中解析 CSV 文件,包括代码示例和最佳实践。
标准 CSV 解析器通常处理逗号分隔的简单数据,但当数据包含不规则分隔符、多行字段或特殊字符时,正则表达式可以提供更强的匹配能力。例如,处理日志文件或自定义格式的文本数据。
确保已安装 Go 环境(1.16+ 版本推荐)。无需额外库,Go 的标准库 regexp 和 strings 即可满足需求。
package main
import (
"fmt"
"io/ioutil"
"regexp"
"strings"
)
func main() {
data, err := ioutil.ReadFile("data.csv")
if err != nil {
panic(err)
}
content := string(data)
// 后续解析代码
}
CSV 字段可能包含引号或逗号,例如:"Hello, World",123,"Quote\"Inside"。使用正则表达式匹配字段:
pattern := `("[^"]*"|[^,]+)`
re := regexp.MustCompile(pattern)
此模式匹配:
lines := strings.Split(content, "\n")
for _, line := range lines {
if strings.TrimSpace(line) == "" {
continue // 跳过空行
}
matches := re.FindAllString(line, -1)
// 移除字段可能的引号
for i, field := range matches {
matches[i] = strings.Trim(field, `"`)
}
fmt.Println(matches) // 输出解析后的字段切片
}
package main
import (
"fmt"
"io/ioutil"
"regexp"
"strings"
)
func main() {
data, _ := ioutil.ReadFile("sample.csv")
content := string(data)
re := regexp.MustCompile(`("[^"]*"|[^,]+)`)
lines := strings.Split(content, "\n")
for _, line := range lines {
if strings.TrimSpace(line) == "" {
continue
}
fields := re.FindAllString(line, -1)
for i, f := range fields {
fields[i] = strings.Trim(f, `"`)
}
fmt.Printf("Parsed: %v\n", fields)
}
}
`("(\.|[^"])*"|[^,]+)`)。若无需复杂匹配,优先使用 encoding/csv 库:
import "encoding/csv"
reader := csv.NewReader(file)
records, _ := reader.ReadAll()
总结:正则表达式为 Go 中解析非标准 CSV 提供了灵活性,但应根据需求权衡性能与复杂度。通过本文示例,您可以快速实现自定义 CSV 解析逻辑。