1.2.8 解析CSV数据

  1. Go语言可以通过简单的逐行扫描输入并使用strings.Split()等函数解析CSV格式

  2. Go语言也可以使用encoding/csv包来处理,encoding/csv包中NewReader()函数返回Reader结构体,该结构体提供了读取CSV文件的API接口

  3. 解析CSV步骤流程如下:

    1. 调用os.Open()函数打开将要解析的文件,代码如下:

      file, err := os.Open("test.csv")
      if err != nil {
          panic(err)
      }
      defer file.Close()
    2. 调用encoding/csv包中NewReader()函数返回Reader结构体,并设置Reader结构体的Comma字段来设置分隔符,代码如下:

      // 返回Reader结构体
      reader := csv.NewReader(file)
      // 设置分隔符
      reader.Comma = ";"
      // reader.FieldsPerRecord = 1

      备注:

      1. Reader结构体根据需要保留变量来配置读取参数

      2. ReaderFieldsPerRecord参数是一个重要设置,如果设置了FieldsPerRecord参数,则会校验每一行的字段计数量是否匹配改参数的值。默认情况下,当设置为0时,则Reader结构体将其设置为第1条记录中的字段数,因此将来的记录必须具有相同的字段计数。如果为正值,则要求每条记录具有给定数量的字段;如果为负值,则不进行校验

    3. 还有一个有趣的配置是注释参数,允许开发者在已解析的数据中定义注释字段,本例中,用这种方式忽略整行

      // 循环读取
      for {
          record, err := reader.Read()
          if err != nil {
              fmr.Println(err)
              break
          }
          fmt.Println(record)
      }
  4. Go语言禁止使用无意义的逗号和注释设置,这意味着null、回车、换行符、无效的符文和Unicode替换字符等都不能使用,此外,Go语言还禁止将逗号和注释设置为相等,完整示例如下

    func main() {
    	file, err := os.Open("test.csv")
    	if err != nil {
    		panic(err)
    	}
    	defer file.Close()
    
    	reader := csv.NewReader(file)
    	reader.Comma = ';'
    
    	for {
    		record, err := reader.Read()
    		if err != nil {
    			fmt.Println(err)
    			break
    		}
    		fmt.Println(record)
    	}
    }

    结果:

    [� � �学号,姓名,分数]
    [1,Barry,99.5]
    [2,Ling,100]
    [3,Jack,88]
    [4,Dong,68]
    EOF

Last updated