2016-10-06 6 views
0

정말 간단한 CSV 파일 구문 분석을 시도하고 있지만 어떤 이유로 인해 파일의 마지막 행만 읽습니다.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]) 
    } 
} 

를 사용하여 시도했다 그리고 나는이 조각 정말 간단 보인다 온라인을 발견 이러한 조각의

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

모두에서 단순한 reader.Read() 시도했습니다. 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("") 
    } 
+0

readAll() 버전이 작동 했어야하고, 사용할 때 어떤 결과가 나왔습니까? –

+0

1 행에 모든 행을 인쇄하지 않는 것이 확실합니까? – Chris

+0

그래서 Sublime과 같은 텍스트 편집기로 CSV 파일을 열면 CSV 파일이 여러 줄로 나타 났지만 실제로는 Vim에서 "^ M"문자로 구분 된 것은 단지 한 줄이었습니다. 방금 인쇄를 사용하면 마지막 행만 인쇄됩니다 (모든 행을 인쇄하기에는 너무 길기 때문에). 그럼 내 부분에 그냥 멍청한 실수 야. – user3125693

답변

0

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) 
    } 
} 

출력이 잘 작동



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"