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

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

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

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

Q&A

1回答

1970閲覧

実装方法、検索アルゴリズムの改善

achai

総合スコア7

Ruby

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

0グッド

0クリップ

投稿2017/03/01 10:01

###課題
下記の課題を出題されました。
機能としては実装できましたが、よりよいアルゴリズム、実装方法があるのでは?と考えております。
アドバイスを頂きたく投稿致しました。
下記の2つのプログラムを作成致しました。

1.郵便番号のCSV (http://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip)を使用し、住所レコードファイルを作成する機能

2.与えられた文字列中の文字をすべて含む住所レコードを上記で作成したインデックスを用いて検索し出力する機能。ただしスペースは文字として扱わない。
(データベースまた検索エンジンを使うのはNG)

###該当のソースコード

make_index_file_convert.rb

# initializae_variable I = 0 raw_str="" # call_packages require 'csv' require 'kconv' # read_csv_file read_file = ARGV[0] # make_index_file_and_write_record File.open("index_file.csv",'w') do |file| CSV.foreach('../data/KEN_ALL.CSV', encoding: "SJIS:UTF-8" ) do |row| output_record = "#{row[2]},#{row[6]},#{row[7]},#{row[8]}\n" puts output_record file.write(output_record) end end
# call_packages require 'csv' require 'kconv' # set_search_word search_word = ARGV[0] puts search_word class Array def which_elements_is_include(value) self.map.with_index{|item, i| i if item.include?(value)}.compact end end #CSV.open("index_file.csv","r") do |csv| CSV.foreach("index_file.csv") do |row| check = row.which_elements_is_include("渋谷") #現在は文言をベタがにしております。 array_length = check.length # p array_length if array_length != 0 p row end end

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

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

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

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

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

guest

回答1

0

こんなのをかいてみました。

ken_to_index.rb

ruby

1# coding: utf-8 2# See http://qiita.com/ya-mada/items/c162383eda33dc516c39 3# http://tech-kazuhisa.hatenablog.com/entry/20121110/1352558835 4# http://seesaawiki.jp/emanon/d/Ruby%A4%C7%CD%B9%CA%D8%C8%D6%B9%E6%A4%F2%B8%A1%BA%F7 5 6require 'zip' 7require 'csv' 8require 'kconv' 9 10# Zip 解凍 11def uncompress(path, outpath) 12 entrys = [] 13 Dir.mkdir(outpath) unless Dir.exist?(outpath) 14 # 2つ目の引数は offset 15 Zip::InputStream.open(path, 0) do |input| 16 # get_next_entryすると input の offset(ポインタ)が動く 17 while (entry = input.get_next_entry) 18 # 書き出し先を作る 19 save_path = File.join(outpath, entry.name) 20 File.open(save_path, 'w') do |wf| 21 # get_next_entry でポインタが動いているので、毎回 input.read で OK 22 wf.puts(input.read) 23 end 24 entrys << save_path 25 end 26 end 27 # 解凍されたファイル名の配列を返す 28 entrys 29end 30 31def make_index(csv_filename, address_file) 32 File.open(address_file) do |file| 33 CSV.foreach(csv_filename, encoding: 'SJIS:UTF-8').with_index do |row, idx| 34 output_record = "#{idx} #{row[6]} #{row[7]} #{row[8]}" 35 file.puts(output_record.encode('utf-8')) 36 end 37 end 38end 39 40ZIP_FILE = 'ken_all.zip'.freeze 41UNZIP_OUT_DIR = '.'.freeze 42ADDRESS_FILE = 'index.txt'.freeze 43 44filenames = uncompress(ZIP_FILE, UNZIP_OUT_DIR) 45make_index(filenames[0], ADDRESS_FILE) 46

search.rb

ruby

1require 'kconv' 2 3INDEX_FILE = 'index.txt'.freeze 4CSV_FILE = 'KEN_ALL.CSV'.freeze 5CSV = File.readlines(CSV_FILE, encoding: 'SJIS') 6 .map { |row| row.encode('utf-8') } 7 .freeze 8 9def match_strs(address, substrs) 10 substrs.each { |str| return false unless address.include?(str) } 11 true 12end 13 14def search(substrs) 15 File.open(INDEX_FILE, 'r') do |file| 16 file.each_line do |line| 17 strs = line.split(' ') 18 idx = strs[0].to_i 19 address = strs[1..-1].join 20 puts CSV[idx] if match_strs(address, substrs) 21 end 22 end 23end 24 25substrs = ARGV 26search(substrs) 27

投稿2017/03/01 15:39

katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問