質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Q&A

解決済

1回答

2628閲覧

Rubyを用いてCSVファイルの配列を読み込んでJSON(TopoJSON)ファイルの文字置換をするプログラムを作りたいです。

AudioStakes

総合スコア41

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

0グッド

1クリップ

投稿2015/12/02 04:48

編集2015/12/02 10:13

RubyでCSVファイルの配列を読み込んでJSON(TopoJSON)ファイルの文字置換をするプログラムを作りたいです。

それぞれのファイルの中身は以下のようになっています。

☆JSON(TopoJSON)ファイルの中身

{"type":"Topology","objects":{"hokkaido":{"type":"GeometryCollection","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::4612"}},"geometries":[
{"type":"Polygon","properties":{"name":"札幌市"},"arcs":[[0,1,2,3,4,5]]},
{"type":"Polygon","properties":{"name":"旭川市"},"arcs":[[6,-6,7,8,9,10]]},
{"type":"Polygon","properties":{"name":"小樽市"},"arcs":[[11,-1,-7,12,13]]},
{"type":"Polygon","properties":{"name":"函館市"},"arcs":[[14,15,16,-2,-12,17]]}・・・

☆CSVファイルの中身
1列目 2列目
札幌市 id011002
函館市 id012025
小樽市 id012033
旭川市 id012041


行いたいことは
①JSON(TopoJSON)ファイルの中からCSVファイルの1列目と同じ文字列を見つける(札幌市、など)
②見つけた文字列をCSVファイルの2列目の文字列に置換する(札幌市の場合は、id011002)
③全ての文字列を置換し終えたJSON(TopoJSON)ファイルを出力

このようなことをRubyを用いて実現したいのですが、そのやり方がわかりません。
もしご存知の方がおりましたら、お知恵を貸していただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私がとりあえずざっくり作るなら次のようなかんじでしょうか。
実際には該当するものが CSV になかった場合などのエラー処理を適宜いれてください。

lang

1#!/usr/local/bin/ruby 2 3require 'json' 4require 'csv' 5 6class Converter 7 attr_accessor :source, :pattern 8 9 def convert 10 source.each do |chunk| 11 chunk['properties']['name'] = replace(chunk['properties']['name']) 12 end 13 end 14 15 private 16 17 def replace(str) 18 if (result = pattern.find { |s| s[0] == str }) 19 # 該当したので、置き換えるべき文字列を返す 20 result[1] 21 else 22 # 該当するものがなかったのでそのまま 23 str 24 end 25 end 26end 27 28converter = Converter.new 29 30converter.source = JSON.parse(<<"") 31[ 32 {"type":"Polygon","properties":{"name":"札幌市"},"arcs":[[0,1,2,3,4,5]]}, 33 {"type":"Polygon","properties":{"name":"旭川市"},"arcs":[[6,-6,7,8,9,10]]} 34] 35 36converter.pattern = CSV.parse(<<"") 37札幌市,id011002 38函館市,id012025 39小樽市,id012033 40旭川市,id012041 41 42puts converter.source # before 43converter.convert 44puts converter.source # after 45 46puts JSON.dump(converter.source)

投稿2015/12/02 06:32

編集2015/12/02 06:36
ryochin

総合スコア280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

AudioStakes

2015/12/02 07:03

早速ありがとうございます! プログラミングを試したところ、期待通りの結果が得られました! ただ一つ、 フォルダの中のCSVファイルとJSONファイルを自動取り込みして、 返還後のJSONファイル(名前を変更)を自動出力することができるようにしたいな、と思います。 自分で調べてやってみようと思うのですが、もし何かアイデアがありましたら教えて頂けると幸いです。
ryochin

2015/12/02 07:26

ファイルの読み込みは Dir.glob, File.find, File.read あたりのキーワードでウェブを検索するとたくさんの情報があります。
AudioStakes

2015/12/02 08:55

ファイル読み込みのメソッドを教えて頂き、ありがとうございます。 色々と試しているのですが、上手くいっておりません。 rename_test.jsonというjsonファイルを読み込ませてメソッドに使いたいのですが json_file = 'rename_test.json' json_data = open(json_file) do |io| JSON.load(io) end converter.source = JSON.parse(json_data) とすると以下のエラーが出ます c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize': no implicit conversion of Array into String (TypeError) from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `new' from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse' from rename.rb:40:in `<main>' また、 file=open('rename_test.json') json_data = file.each_line { |line| json=JSON.load(line) puts json['kana'] } converter.source = JSON.parse(json_data) とした場合は、すべて読み出せてはいるようですが以下のエラーが出ます c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `initialize': no implicit conversion of File into String (TypeError) from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `new' from c:/RailsInstaller/Ruby2.0.0/lib/ruby/gems/2.0.0/gems/json-1.8.3/lib/json/common.rb:155:in `parse' from rename.rb:35:in `<main>' どのようにすればエラーをなくし、変換後のJSONファイルを出力できるでしょうか? プログラミング知識が少ないもので、申し訳ありません。初心者マークをつけ忘れていました。
ryochin

2015/12/02 11:23

no implicit conversion of Array into String とあるので配列を文字列として扱おうとしてエラーになっています。no implicit conversion of File into String とあるのでファイルを文字列として扱おうとしてエラーになっています。 JSON.load() の引数は「JSON 形式の文字列」とマニュアルに書いてあるので読みましょう。これはプログラミングの知識の問題ではなくて、習慣の問題です。 http://docs.ruby-lang.org/ja/2.2.0/method/JSON/m/load.html ということで、正しく「文字列」を渡してあげてください。`pp` で変数の値を出力して、期待している通りの値かどうか見ましょう。 ```lang-ruby require 'pp' pp io pp line ``` これ以降は、本質問の範囲を超えていると思いますから、新しくトピックを立てるのがよいとおもいます。
AudioStakes

2015/12/02 11:32

ご指摘ありがとうございます!大変勉強になりました。 リファレンスを見つつ、解決していこうと思います。 何度も質問に答えていただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問