【发布时间】: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 行。有谁知道为什么会这样?
我以为Print 和Println() 的行为方式相同,只是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”字符分隔。当我刚刚使用打印时,它只会打印最后一行(因为打印每一行都太长了)。所以是的,这只是我的一个愚蠢的错误