2017-11-27 24 views
2

私は運がないcsvファイルにマップを正しく書き込む方法を見つけようとしています。マップをCSVに書き込む

私は本質的にはSQLデータベースを照会するプログラムを持っています。戻り値の1つをマップのキーとして保存し、返されたデータの文字列のスライスをマップの例として格納します:

var m = make(map[string][]string) 

m['test1'] = [5, 4, 3] 

ので、CSV形式にそれを書くことがちょうどリスト/スライスのようなCSV形式に出力

test1, 5, 4, 3

その私はそれを容易にするためのマップに格納するよ、だろうだろう動的クエリを他の場所に構築することができます。

私がするようなforループを使用しようとしてきました

for key, value := range m{ 
    writer.Write(key) 
    writer.Write(value) 
} 

が、私は次のようなエラーになっている:私はグーグルで、ここで検索をたくさんやった

cannot use key (type string) as type []string in argument to writer.Write

をし、これを適切に行う方法を見つけることができないようです。

+3

文字列の一時スライスを作成し、インデックス0をマップキーに設定してマップ値を追加する必要があります。 – Volker

答えて

3

Package csv

func (*Writer) Write

func (w *Writer) Write(record []string) error 

Writer writes a single CSV record to w along with any necessary quoting. A record is a slice of strings with each string being one field.


error: cannot use key (type string) as type []string in argument to writer.Write


"I've done a lot of googling and searching here."

、この問題を解決するためWriteのマニュアルを読み、エラーメッセージの指示に従ってください、あなたはタイプstringを持って、Write[]stringを入力したいと考えています。たとえば、

for key, value := range m { 
    r := make([]string, 0, 1+len(value)) 
    r = append(r, key) 
    r = append(r, value...) 
    err := writer.Write(r) 
    if err != nil { 
     // handle error 
    } 
} 
writer.Flush() 
+0

ありがとう!私は言語に少し戸惑っていますが、ドキュメントのいくつかは混乱しています。これは完璧な意味合いを持ち、一時的なスライスを避けようとしていましたが、それを行う方法になると思われます。ありがとう! – Dangle

+2

@Dangle:スライスは、長さ、容量、および基礎となる配列へのポインタ、64ビットアーキテクチャ上の24(3 *(64/8))バイトの 'struct 'です。 'make([] string、0、1 + len(value))'はスライスの 'string'の配列の正確なサイズを割り当てました。これは' append'中の再割り当てを避けます。 'string'は長さと基礎となる文字列バイトへのポインタを持つ' struct'です。 – peterSO

+1

@Dangle:rの値が作成されると、スライス記述子( 'structs')が割り当てられ、コピーされます。我々は文字列の値を割り当てたりコピーしたりせず、ポインタのみをコピーします。だからそれほど高価ではありません。 – peterSO

関連する問題