Разбор CSV в golang с кодировкой ISO-8859-1 - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть CSV-файл, который имеет строку заголовков, а затем несколько десятков строк. Когда я пытаюсь прочитать его как CSV, он возвращается как 1 большой фрагмент. Почему он не возвращается в виде отдельных строк? Вход выглядит так:

COL1,COL2
val1,val2
val1,val2
val1,val2

object.Body является ReadCloser

lines, err := csv.NewReader(object.Body).ReadAll()
if err != nil {
    log.Fatal(err)
}

for _, line := range lines {
    log.Print(line)
}

Выход возвращается как

[COL1 COL2
val1,val2
val1,val2
val1,val2]

Я ожидаю, что возврат будет:

[
  [val1, val2],
  [val1, val2],
  [val1, val2],
]

Есть идеи? Полностью озадачен этим.

Редактировать Я по ошибке забыл добавить запятую в шапку. Это было только в примере кода, а не в реальной проблеме. Извините за путаницу.

Редактировать Я полагаю, что эта проблема связана с другой кодировкой CSV-файла.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

С CSV RFC :

  3.  There maybe an optional header line appearing as the first line
   of the file with the same format as normal record lines.  This
   header will contain names corresponding to the fields in the file
   and should contain the same number of fields as the records in
   the rest of the file (the presence or absence of the header line
   should be indicated via the optional "header" parameter of this
   MIME type).  For example:

   field_name,field_name,field_name CRLF
   aaa,bbb,ccc CRLF
   zzz,yyy,xxx CRLF

В заголовке отсутствует запятая, поэтому анализатор считает, что весь файл имеет ширину в один столбец.

0 голосов
/ 11 ноября 2018

Я думаю, что первая строка в предоставленном вами образце сформирована неправильно. Разве это не должно быть COL1,COL2 вместо этого?

Я думаю, что следующий код делает то, что вы хотите:

package main

import (
    "bytes"
    "encoding/csv"
    "fmt"
)

func main() {
    data := bytes.NewBufferString(`COL1,COL2
val1,val2
val1,val2
val1,val2`)

    reader := csv.NewReader(data)
    reader.Read() // Skip header
    lines, err := reader.ReadAll()

    if err != nil {
        panic(err)
    }

    fmt.Println(lines)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...