Go语言:使用csv.NewReader时如何获取正确的字段数量?
解决Go csv.NewReader解析CSV字段数量不符的问题
我来帮你搞定这个问题~首先咱们得弄明白为什么会出现字段数量不对的情况:
你用的csv.NewReader默认会把双引号"当成CSV字段的包裹符,哪怕开启了LazyQuotes=true,它还是会按照CSV规则处理引号的转义逻辑。在你的测试输入||""FOO""||里,默认的解析规则会把""FOO""当成一个带引号包裹的字段,同时没有按你预期的保留所有空字段——本质上是你希望完全忽略引号的存在,只按|分隔符拆分内容,但默认的CSV引号规则干扰了这个过程。
解决方案:禁用引号解析
如果你不需要解析CSV的引号规则(比如你的场景里有大量双引号,只是普通文本),可以直接把解析器的Quote选项设置为一个不存在的字符(比如rune(0)),这样解析器就会完全忽略引号,只按分隔符拆分内容。
修改后的代码如下:
package main import ( "encoding/csv" "fmt" "log" "strings" ) func main() { parser := csv.NewReader(strings.NewReader(`||""FOO""||`)) parser.Comma = '|' parser.LazyQuotes = true parser.Quote = rune(0) // 禁用引号解析 record, err := parser.Read() if err != nil { log.Fatal(err) } fmt.Printf("record length: %v\n", len(record)) fmt.Printf("record content: %#v\n", record) }
运行这段代码后,你会得到预期的结果:
record length: 5 record content: []string{"", "", "\"\"FOO\"\"", "", ""}
为什么这个方案有效?
当Quote被设置为rune(0)时,csv.Reader不会将任何字符视为字段包裹符,所有内容都作为普通文本处理。这时候连续的|分隔符就会被正确识别为多个空字段,完全符合你对字段数量的预期。
如果你的实际场景中偶尔需要处理引号包裹的字段,那可能需要更复杂的逻辑,但根据你描述的「包含大量双引号的大型CSV文件」,禁用引号解析是最简单高效的方案。
内容的提问来源于stack exchange,提问作者DevonDahon
相关产品推荐
相关产品推荐

