使用golang在CSV文件中解析嵌套的JSON对象

时间:2018-04-09 08:55:17

标签: json csv parsing go

我试图解析最后一列中包含JSON对象的CSV文件 以下是输入CSV文件中两行的示例:

'id','value','createddate','attributes'
524256,CAFE,2018-04-06 16:41:01,{"Att1Numeric": 6, "Att2String": "abc"}
524257,BEBE,2018-04-06 17:00:00,{}

我尝试使用csv包中的解析器:

func processFileAsCSV(f *multipart.Part) (int, error) {
  reader := csv.NewReader(f)
  reader.LazyQuotes = true
  reader.Comma = ','
  lineCount := 0
  for {
    line, err := reader.Read()
    if err == io.EOF {
        break
    } else if err != nil {
        fmt.Println("Error:", err)
        return 0, err
    }

    if lineCount%100000 == 0 {
        fmt.Println(lineCount)
    }
    lineCount++
    fmt.Println(lineCount, line)
    processLine(line) // do something with the line
  }

  fmt.Println("done!", lineCount)
  return lineCount, nil
}

但我收到了一个错误:

  

错误:第2行,第0列:行中的字段数错误,

可能是因为解析器忽略了以{开头的JSON范围。

我应该编写自己的CSV解析器,还是有可以处理此问题的库?

1 个答案:

答案 0 :(得分:2)

您的CSV输入不符合普通的CSV惯例,使用不带引号的字段(对于JSON)。

我认为最好的方法是在Go程序或外部脚本中预处理输入。

如果您的CSV输入是可预测的(如您的问题中所示),则应该很容易正确引用最后一个元素,例如,在将其传递给CSV解析器之前使用简单的strings.Split调用。