2014-01-24 27 views
1

我想引用CSV文檔中的所有字段。有沒有辦法修改golang的csv模塊而不必複製所有的代碼?在另一種語言中,我只是從csv.Writer繼承並覆蓋fieldNeedsQuotes,但這在Go中不可行,還是它?始終引用csv值

+0

至少在Java和Python中,將從父類中調用overriden方法。你能製作一個能夠顯示其他內容的程序嗎[見本演示](http://ideone.com/e4gIZU)和輸出。 – phihag

+0

幾乎:例如沒有許多其他語言的繼承。只需複製代碼並將fieldNeedsQuotes替換爲true即可。死簡單,不需要繼承。 – Volker

+0

您不能在Go中「覆蓋」方法,也不能將方法添加到它們定義的包之外的結構中。但是,如果我可能會問,爲什麼要引用CSV文件中的每個值?這不是必要的,可以使它更大,我敢打賭,Go不支持在encoding/csv包中執行它。 – Matt

回答

-1

Matt和Volker已經表示可以複製模塊並對其進行修改。

你也可以使用Writer包裝器,但我認爲它有點複雜。 看到我的嘗試作爲概念證明(不被使用*)。

type quoteWriter struct { 
    w io.Writer 
} 

func (w quoteWriter) Write(p []byte) (n int, err error) { 
    q := make([]byte, 0) 
    quoted := true 
    quoted = (p[0] == '"') 
    if !quoted { 
     //begin field quote 
     q = append(q, '"') 
    } 

    for i, v := range p { 
     //We check the "quotation" status for new field or line 
     //This is a simplification 
     if v == ',' || v == '\n' { 
      if !quoted { //end field quote 
       q = append(q, '"') 
      } 
      //copy current byte 
      q = append(q, v) 

      //is next byte quote? 
      if len(p) > i+1 { 
       quoted = (p[i+1] == '"') 
      } 
      if !quoted { //begin field quote 
       q = append(q, '"') 
      } 
     } else { 
      q = append(q, v) 
     } 
    } 

    return w.w.Write(q) 
} 

請參閱從CSV#編寫測試(http://golang.org/src/pkg/encoding/csv/writer_test.go)與概念驗證應用來下面的例子:

http://play.golang.org/p/wovYUkt6Vq

不使用*請注意,我的天堂例如,如果逗號在引用文本內,則不檢查所有情況,因此您需要檢查並修改它。 我也建議複製和修改csv包。