【Golang】CSVの要素をダブルクォーテーションで囲む

こんにちは、技術部の M です。
今回は Golang を使って CSV の各要素をダブルクォーテーションで囲む処理を行いたいと思います。

【背景】
プロジェクト内で CSV を提出する際にダブルクォーテーションで囲むという要件 & 提出前にデータを Golang で加工
→ そのまま出力しようとするとダブルクォーテーションで囲まれずに要素とカンマのみになってしまうという事象が発生
→ 各要素をダブルクォーテーションで囲むように修正すると意図しない形で出力される事象が発生

CSV 出力時の問題点

まず、"encoding/csv"がどのような挙動をするのか見てみましょう。

<加工前データ>

				
					"太郎","20歳","男"
"花子","22歳","女"
"一郎","25歳","男"


				
			

<read()後、Write()で出力した場合>

				
					太郎,20歳,男
花子,22歳,女
一郎,25歳,男
				
			

上記の結果のように、"encoding/csv"を使って CSV の読み込み・書き込みを行うと加工前についていたダブルクォーテーションは外れます。これは read()時に CSV の構造体として読み込むため、ダブルクォーテーションは要素としては認識されないからです。
次に各要素をダブルクォーテーションで囲って出力するようにしたいと思います。

				
					go
for i, value := range record {
  record[i] = "\"" + value + "\""
}

				
			

<結果>

				
					"""太郎""","""20歳""","""男"""
"""花子""","""22歳""","""女"""
"""一郎""","""25歳""","""男"""

				
			

結果としては 3 つのダブルクォーテーションで囲まれてしまいました。これは追加したダブルクォーテーションにはエスケープ文字としてダブルクォーテーションが付与されているためです。
このようにただ CSV を読み込んで、単純にダブルクォーテーションで囲むようにするだけでは上手くいかないことが分かりました。


解決策

read()で取得した要素を文字列に変換し最終的に fmt.Println()で出力することで、"encoding/csv"で出力する形を回避するように処理を書きました。

				
					go
for i, field := range record {
record[i] = `"` + field + `"`
}

var string_record string
string_record = strings.Join(record, ",")
fmt.Println(string_record)

				
			

文章にすると簡単な解決策ですが、この結論にたどり着くために色々検証をして手こずりました。。。
これからは沼る前に、まずどんな挙動をするのか理解してからあれこれ触るようにします。
最後までご覧いただき、ありがとうございました。

スーパーソフトウエアの採用情報

あなたが活躍できるフィールドと充実した育成環境があります

blank
blank