業務で二次元配列のデータをcsv形式に変換する必要があり、
思ったより苦戦したので、記録として残してみました。
元となるデータ
業務のデータをそのまま使うわけにはいかないので、
こちらのデータを使用していきます。
test_data = [['りんご', 'みか\nん'], ['いちご', 'メ"ロ"ン'], ['ブドウ', 'キウ,イ']]
result = "" # 変換後のデータを格納する
最初に自分で考えた処理
for i in range(len(data)):
keep = ",".join(data[i])
if (i == 0):
result = keep
else:
result = result + "\n" + keep
ひどいですね。。笑
かなり分かりにくい書き方なうえに、
エスケープ文字にも対応できていません。
上司に相談したところ、「リスト内包表記」 というのが、
for分の代わりに使えるとのことでした。
なので、ひとまずエスケープ文字は無視して、
全体の処理を整理していこうと思います。
リスト内包表記って?
[式 for 任意の変数 in イテラブルオブジェクト]
こんな感じで書くみたいです。
イテラブルオブジェクトは、繰り返し可能なオブジェクトのことで、
「リスト」とか「タプル」とか「range関数」が該当するとのこと。
リスト内包表記を使ってみた
result = [",".join(test_data[x]) for x in range(len(test_data))]
newline_result = "\n".join(result)
かなり見やすくなりました!
ただ、まだrangeの部分だったり2行になってしまっていたりで、無駄が多いです。
1行にまとめてみた
result = "\n".join([",".join(x) for x in test_data])
最初に比べると、見違えるように見やすい、、、!
エスケープ文字に対応させた
result = "\n".join([",".join(['"' + y.replace('"', '""') + '"' for y in x]) for x in test_data])
エスケープ文字にも対応できました👍