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

を使用してみましたそして、私は単純なreader.Read()このスニペットから

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

私は本当に簡単なようで、オンラインを発見したこれらのスニペットの両方を試してみました。 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 

EDIT:
私は私が間違って何が起こっているのかが分かったと思います。下のコードで、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

どうしたのですか?サブライムのようなテキストエディタでCSVファイルを開くとCSVファイルがたくさん表示されましたが、実際にはvimの "^ M"文字で区切られたのは1行だけでした。私が印刷を使用した直後は、最後の行だけが印刷されます(1行ごとに印刷するには時間がかかりすぎます)。だからちょうど私の部分でちょっとばかなミス – 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"