3

ユーザーPetriのおかげでCSVからJSONへのPythonスクリプトができました。これにより、GeonamesCSVダンプをMongoImport対応のJSONに変換できます。

問題は、Geonamesに、alternatenames現在引用されて1つの長い文字列として扱われているというフィールドがあることです。したがって、MongoDBでは適切にクエリできません。フィールドを次のような文字列配列に変更したいと思います。"alternatenames":["name1", "name2"]

Pythonスクリプトは次のようになります。

import csv, simplejson, decimal, codecs

data = open("cities.txt")
reader = csv.DictReader(data, delimiter=",", quotechar='"')

with codecs.open("cities.json", "w", encoding="utf-8") as out:
   for r in reader:
      for k, v in r.items():
         # make sure nulls are generated
         if not v:
            r[k] = None
         # parse and generate decimal arrays
         elif k == "loc":
            r[k] = [decimal.Decimal(n) for n in v.strip("[]").split(",")]
         # generate a number
         elif k == "geonameid":
            r[k] = int(v)
      out.write(simplejson.dumps(r, ensure_ascii=False, use_decimal=True)+"\n")

私のCSVには次のフィールドがあります。

"geonameid","name","asciiname","alternatenames","loc","feature_class","feature_code","country_code","cc2","admin1_code","admin2_code","admin3_code","admin4_code"
3,"Zamīn Sūkhteh","Zamin Sukhteh","Zamin Sukhteh,Zamīn Sūkhteh","[48.91667,32.48333]","P","PPL","IR",,"15",,,
5,"Yekāhī","Yekahi","Yekahi,Yekāhī","[48.9,32.5]","P","PPL","IR",,"15",,,
7,"Tarvīḩ ‘Adāī","Tarvih `Adai","Tarvih `Adai,Tarvīḩ ‘Adāī","[48.2,32.1]","P","PPL","IR",,"15",,,

現在のJSON出力は次のようになります。

{"loc": [48.91667, 32.48333], "name": "Zamīn Sūkhteh", "geonameid": 3, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": "Zamin Sukhteh,Zamīn Sūkhteh", "asciiname": "Zamin Sukhteh", "admin4_code": null}
{"loc": [48.9, 32.5], "name": "Yekāhī", "geonameid": 5, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": "Yekahi,Yekāhī", "asciiname": "Yekahi", "admin4_code": null}
{"loc": [48.2, 32.1], "name": "Tarvīḩ ‘Adāī", "geonameid": 7, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": "Tarvih `Adai,Tarvīḩ ‘Adāī", "asciiname": "Tarvih `Adai", "admin4_code": null}

次のように文字列配列を追加するようにJSON出力を変更したいと思います(右にスクロールしてalternatenames):

{"loc": [48.91667, 32.48333], "name": "Zamīn Sūkhteh", "geonameid": 3, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": ["Zamin Sukhteh", "Zamīn Sūkhteh"], "asciiname": "Zamin Sukhteh", "admin4_code": null}
{"loc": [48.9, 32.5], "name": "Yekāhī", "geonameid": 5, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": ["Yekahi,Yekāhī"], "asciiname": "Yekahi", "admin4_code": null}
{"loc": [48.2, 32.1], "name": "Tarvīḩ ‘Adāī", "geonameid": 7, "feature_class": "P", "admin3_code": null, "admin2_code": null, "cc2": null, "feature_code": "PPL", "country_code": "IR", "admin1_code": "15", "alternatenames": ["Tarvih `Adai", "Tarvīḩ ‘Adāī"], "asciiname": "Tarvih `Adai", "admin4_code": null}

また、quotecharAccess 2010でエクスポートしたCSVを、二重引用符を避ける^代わりにに変更する必要がありますか?"

助けてくれてありがとう。

4

3 に答える 3

2

「代替名」を処理するために、既存のものに別の「elif」を追加します。

     elif k == "alternatenames":
        r[k] = [name.strip() for name in v.split(",")]

したがって、最初に文字列をコンマで分割してから、開始/終了の空白を削除します。

于 2012-12-11T08:49:52.897 に答える
0

ここであなたのquotecharが問題になるとは思いません。そのフィールドを文字列リストに変換することを手動で指定する必要があります。

警告:テストされていないコードが続きます

elif k == "alternatenames":
    r[k] = unicode.split(v, ',')

vは文字ベースのユニコードだと思いますが、ASCIIの場合は調整してください。

于 2012-12-11T08:44:33.067 に答える
0

これを含めてみてください:

elif k == "alternatenames":
   r[k] = [v.split(",")]
于 2012-12-11T08:46:57.690 に答える