個人的に使う表現ランキング。
Nimはスクリプト言語じゃないから本来の書き方から離れがちではあるけど。
やるぞっ。
1. CSVの読み込み(簡易)
csv_data = [i.strip().split(",") for i in open("hoge.csv").readlines()]
Nim
import strutils, sequtils var csv_data = readFile("hoge.csv").split("\n").mapIt(it.strip.split(","))
2. 転置
data = [[1,2,3], [4,5,6]] data2 = [[j[i] for j in data] for i in range(len(i))]
Nim
import sequtils var data = [[1,2,3], [4,5,6]] data2 = block: var tmpdata: seq[seq[int]] for i in 0..<data.len: tmpdata.add(data.mapIt(it[i])) tmpdata
3. CSV形式→JSON形式
list_data = [ ["1", "2", "3", "4"], # <- csv header ["A", "B", "C", "D"], ["E", "F", "G", "H"] ] dict_data = [{key:vals[i] for i, key in enumerate(list_data[0])} for vals in list_data[1:]] """ [ {'1': 'A', '2': 'B', '3': 'C', '4': 'D'}, {'1': 'E', '2': 'F', '3': 'G', '4': 'H'} ] """
Nim
import json, sequtils, tables var list_data = [ ["1", "2", "3", "4"], # <- csv header ["A", "B", "C", "D"], ["E", "F", "G", "H"] ] # 発想はPythonと同じで、list_dataのvalue部分をイテレートしてkey部分の要素と1:1でdictを作っている # seq[(string, string)]だと%でJsonに変換できなくて間にtoTableを嚙ましてある dict_data = %list_data[1..^1].mapIt(% zip(list_data[0], it).toTable) # さすがに分かりづらい。 # 普通に書くならこうかも dict_data = block: var keys = list_data[0] tmpdata = %[] for vals in list_data[1..^1]: tmpdata.add( % zip(keys, vals).toTable) tmpdata
4. Jsonの配列オブジェクトから任意の値を削除
dict_data = [ {"id": 1, "name": "Yulia"}, {"id": 2, "name": "Raoh"}, {"id": 3, "name": "Toki"}, ] # lambdaよりもこっちが書きやすいと思う dict_data_2 = [i for i in dict_data if i["id"]!=2]
Nim
import json, sequtils var dict_data = %* [ {"id": 1, "name": "Yulia"}, {"id": 2, "name": "Raoh"}, {"id": 3, "name": "Toki"}, ] dict_data_2 = %* dict_data.getElems.filterIt(it["id"].getInt!=2)
5. Jsonファイルの保存
import json dict_data = [ {"id": 1, "name": "Yulia"}, {"id": 2, "name": "Raoh"}, {"id": 3, "name": "Toki"}, ] json.dump(dict_data, open("hoge.json", "w"), indent=2)
Nim
import json dict_data = %* [ {"id": 1, "name": "Yulia"}, {"id": 2, "name": "Raoh"}, {"id": 3, "name": "Toki"}, ] writeFile("hoge.json", dict_data.pretty)
6. CSVの読み込み(commaエスケープなど)
import csv csv_data = list(csv.reader(open("hoge.csv")))
Nim
import parsecsv, sequtils var csv_data = block: var tmpdata: seq[seq[string]] x: CsvParser defer: x.close() x.open("hoge.csv") while x.readRow(): tmpdata.add(x.row) tmpdata
Nimは(Pythonと張り合うために)シェル芸的な書き方が多かったけど実際のコーディングでは適宜block
や関数に落とし込んで実装することが多いかも。
block
が便利すぎる。手続き型みたいに文字空間を汚さないし、関数みたいに別の箇所を参照しなくて良いし。
読む難易度はPythonの内包表記と似たり寄ったりなはず(どちらかが読みにくいと感じたなら、それは他方との習熟度の違いの影響だと思う)