【问题标题】:Go CSV file parsingGo CSV 文件解析
【发布时间】:2016-10-06 18:30:24
【问题描述】:

我正在尝试对 CSV 文件进行非常简单的解析,但由于某种原因,它只读取文件的最后一行。

我试过使用reader.ReadAll()

package main

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

func main() {

     csvfile, err := os.Open("somecsvfile.csv")

     if err != nil {
             fmt.Println(err)
             return
     }

     defer csvfile.Close()

     reader := csv.NewReader(csvfile)

     reader.FieldsPerRecord = -1 // see the Reader struct information below

     rawCSVdata, err := reader.ReadAll()

     if err != nil {
             fmt.Println(err)
             os.Exit(1)
     }

     // sanity check, display to standard output
     for _, each := range rawCSVdata {
             fmt.Printf("email : %s and timestamp : %s\n", each[0], each[1])
     }
}

我已经从这个 sn-p 中尝试了一个简单的reader.Read()

for {
    row, err := csvr.Read()
    if err != nil {
        if err == io.EOF {
            err = nil
        }
    }
    fmt.Println(row)
}

我在网上找到的这两个 sn-ps 看起来都非常简单。 CSV 包似乎也准确地描述了我想要的内容(ReadAll() 应该将整个 CSV 读入一个字符串切片)。

CSV 文件看起来也完全没问题。在线下载一个我有以下内容(每一行都是一个单独的条目,第一行除外)。
我做错了什么?

street,city,zip,state,beds,baths,sq__ft,type,sale_date,price,latitude,longitude
3526 HIGH ST,SACRAMENTO,95838,CA,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.631913,-121.434879
51 OMAHA CT,SACRAMENTO,95823,CA,3,1,1167,Residential,Wed May 21 00:00:00 EDT 2008,68212,38.478902,-121.431028

编辑:
我想我发现出了什么问题。在下面的代码中,如果我将fmt.Print(col) 更改为fmt.Println(col),我最终会打印每一行的每一列。如果我将其保留为fmt.Print(col),我只打印 1 行。有谁知道为什么会这样?
我以为PrintPrintln() 的行为方式相同,只是println() 增加了一个新行?

     // sanity check, display to standard output
     for _, row := range rawCSVdata {
            for _, col := range row {
                    _,err := fmt.Print(col)
                    if err != nil {
                            fmt.Println(err)
                    }
            }
            fmt.Println("")
     }

【问题讨论】:

  • readAll() 版本应该可以工作,你使用它时得到了什么输出?
  • 你确定它没有打印 1 行上的所有行吗?
  • 所以发生的事情是,如果我使用 Sublime 之类的文本编辑器打开 csv 文件,它会显示尽可能多的行,但实际上它在 vim 中只有 1 行由“^M”字符分隔。当我刚刚使用打印时,它只会打印最后一行(因为打印每一行都太长了)。所以是的,这只是我的一个愚蠢的错误

标签: csv parsing go io


【解决方案1】:

for 循环内使用fmt.Print(col) 时,您需要在数据之后添加空格,例如fmt.Print(i, " ")(试试The Go Playground):

package main

import "fmt"    

func main() {
    for i := 0; i < 10; i++ {
        fmt.Print(i)
    }
}

输出:

0123456789

这很好,在The Go Playground上试试:

package main

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

func main() {
    reader := csv.NewReader(strings.NewReader(str))
    reader.TrimLeadingSpace = true
    reader.FieldsPerRecord = -1 // see the Reader struct information below
    rawCSVdata, err := reader.ReadAll()
    if err != nil {
        panic(err)
    }
    for _, each := range rawCSVdata {
        //fmt.Println(each)
        fmt.Printf("%-15q %-150q \n", each[0], each[1])
    }
    fmt.Println()
    for _, row := range rawCSVdata {
        for _, col := range row {
            //fmt.Print(col)
            fmt.Printf("%30q ", col)
        }
        fmt.Println("")
    }
}

var str = `street,city,zip,state,beds,baths,sq__ft,type,sale_date,price,latitude,longitude
    3526 HIGH ST,SACRAMENTO,95838,CA,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.631913,-121.434879
    51 OMAHA CT,SACRAMENTO,95823,CA,3,1,1167,Residential,Wed May 21 00:00:00 EDT 2008,68212,38.478902,-121.431028`

输出:

"street"        "city"                                                                                                                                                 
"3526 HIGH ST"  "SACRAMENTO"                                                                                                                                           
"51 OMAHA CT"   "SACRAMENTO"                                                                                                                                           

                      "street"                         "city"                          "zip"                        "state"                         "beds"                        "baths"                       "sq__ft"                         "type"                    "sale_date"                        "price"                     "latitude"                    "longitude" 
                "3526 HIGH ST"                   "SACRAMENTO"                        "95838"                           "CA"                            "2"                            "1"                          "836"                  "Residential" "Wed May 21 00:00:00 EDT 2008"                        "59222"                    "38.631913"                  "-121.434879" 
                 "51 OMAHA CT"                   "SACRAMENTO"                        "95823"                           "CA"                            "3"                            "1"                         "1167"                  "Residential" "Wed May 21 00:00:00 EDT 2008"                        "68212"                    "38.478902"                  "-121.431028" 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-16
    • 2011-04-25
    • 2016-05-04
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2010-11-19
    相关资源
    最近更新 更多