回答編集履歴

15

修正

2017/01/09 06:22

投稿

退会済みユーザー
test CHANGED
@@ -535,3 +535,9 @@
535
535
  島根県21人
536
536
 
537
537
  ```
538
+
539
+ ###補足について
540
+
541
+ もしかしたらこちらの記事が参考になるかもしれません。
542
+
543
+ [Ruby文字エンコードに悩まされ、直接指定やnkfによる推測などを試した](http://qiita.com/rojiuratech/items/9d40cb294eb08f2204ac)

14

補足

2017/01/09 06:22

投稿

退会済みユーザー
test CHANGED
@@ -108,6 +108,8 @@
108
108
 
109
109
  2017/01/07追記
110
110
 
111
+ 2017/01/09追記
112
+
111
113
  ```Ruby
112
114
 
113
115
  #encoding : utf-8
@@ -427,3 +429,109 @@
427
429
  f.map!{|k| k[4]}.uniq.map{|e|[f.count(e), e]}.sort!.reverse!.map{|word| puts word[1] + word[0].to_s + "人"}
428
430
 
429
431
  ```
432
+
433
+ ```
434
+
435
+ 実行結果例
436
+
437
+ 中沢 由宇2016/1/10女
438
+
439
+ 上山 勤2016/1/10男
440
+
441
+ ---------------------------------------
442
+
443
+ 東京都480人
444
+
445
+ 大阪府369人
446
+
447
+ 神奈川県318人
448
+
449
+ 愛知県295人
450
+
451
+ 埼玉県281人
452
+
453
+ 北海道239人
454
+
455
+ 千葉県227人
456
+
457
+ 福岡県208人
458
+
459
+ 兵庫県184人
460
+
461
+ 静岡県146人
462
+
463
+ 広島県124人
464
+
465
+ 長野県104人
466
+
467
+ 京都府104人
468
+
469
+ 宮城県98人
470
+
471
+ 岐阜県95人
472
+
473
+ 茨城県94人
474
+
475
+ 群馬県90人
476
+
477
+ 栃木県84人
478
+
479
+ 新潟県83人
480
+
481
+ 福島県80人
482
+
483
+ 鹿児島県74人
484
+
485
+ 三重県71人
486
+
487
+ 岩手県70人
488
+
489
+ 熊本県69人
490
+
491
+ 岡山県69人
492
+
493
+ 石川県62人
494
+
495
+ 愛媛県61人
496
+
497
+ 長崎県56人
498
+
499
+ 滋賀県56人
500
+
501
+ 山口県53人
502
+
503
+ 沖縄県52人
504
+
505
+ 大分県52人
506
+
507
+ 奈良県50人
508
+
509
+ 和歌山県48人
510
+
511
+ 青森県47人
512
+
513
+ 秋田県47人
514
+
515
+ 高知県39人
516
+
517
+ 佐賀県39人
518
+
519
+ 香川県38人
520
+
521
+ 山形県38人
522
+
523
+ 山梨県36人
524
+
525
+ 徳島県33人
526
+
527
+ 宮崎県33人
528
+
529
+ 富山県32人
530
+
531
+ 福井県27人
532
+
533
+ 鳥取県24人
534
+
535
+ 島根県21人
536
+
537
+ ```

13

修正

2017/01/09 05:56

投稿

退会済みユーザー
test CHANGED
@@ -210,7 +210,7 @@
210
210
 
211
211
  =end
212
212
 
213
- f = File.read("ファイル名").encode("UTF-8").split("\n").map{|e| e.split("\,")}
213
+ f = File.read("ファイル名.csv").encode("UTF-8").split("\n").map{|e| e.split("\,")}
214
214
 
215
215
  =begin
216
216
 
@@ -230,9 +230,9 @@
230
230
 
231
231
  f.each do |element|
232
232
 
233
- ken << element[5]
233
+ ken << element[4]
234
-
234
+
235
- years << [element[10], element[0], element[2]]
235
+ years << [element[3], element[0], element[2]]
236
236
 
237
237
  end
238
238
 
@@ -296,13 +296,11 @@
296
296
 
297
297
  #13:rank.to_sでrankを文字にします。そうしないと文字と+できません。初めにファイルをUTF-8にエンコード
298
298
 
299
- # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にした
299
+ # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にしたrankの後ろに
300
-
300
+
301
- # rankの後ろにスペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の
301
+ # スペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の1番目の要素=県名と
302
-
303
- # 2番目(配列の要素は0から数える)の要素=県名とken_count(配列)のnum番目にある要素(配列)
302
+
304
-
305
- # の1番目の要素=人数を文字にしたものを足しています。
303
+ # ken_count(配列)num番目にある要素(配列)0番目の要素=人数を文字にしたものを足しています。
306
304
 
307
305
  num += 1 #14:numに1を足します。そうしないと2位以降が表示されなくなります。
308
306
 
@@ -362,7 +360,7 @@
362
360
 
363
361
  end
364
362
 
365
- if woman[0] != nil then #25:womanの中身が空かどうかで処理を分けます。
363
+ if woman[0] != nil then #25:manの中身が空かどうかで処理を分けます。
366
364
 
367
365
  puts "女性:" + woman[0][1] + woman[0][0]
368
366
 
@@ -382,6 +380,28 @@
382
380
 
383
381
  ```
384
382
 
383
+ ```
384
+
385
+ 実行結果例
386
+
387
+ 1 東京都480人
388
+
389
+ 2 大阪府369人
390
+
391
+ 3 神奈川県318人
392
+
393
+ 4 愛知県295人
394
+
395
+ 5 埼玉県281人
396
+
397
+ -------------------------------------------
398
+
399
+ 男性:上山 勤2016/1/10
400
+
401
+ 女性:中沢 由宇2016/1/10
402
+
403
+ ```
404
+
385
405
  ランキング機能を無くしてみました。
386
406
 
387
407
  katoy様が紹介してくださった「なんちゃって個人情報」を使ってデータを作ってみました。

12

補足

2017/01/09 05:53

投稿

退会済みユーザー
test CHANGED
@@ -106,6 +106,8 @@
106
106
 
107
107
  2017/01/07追記
108
108
 
109
+ 2017/01/07追記
110
+
109
111
  ```Ruby
110
112
 
111
113
  #encoding : utf-8
@@ -379,3 +381,29 @@
379
381
  end
380
382
 
381
383
  ```
384
+
385
+ ランキング機能を無くしてみました。
386
+
387
+ katoy様が紹介してくださった「なんちゃって個人情報」を使ってデータを作ってみました。
388
+
389
+ データの内容は「名前、ふりがな、性別、誕生日、都道府県、電話番号」です。
390
+
391
+ 正確に動いているかどうかは分かりません。
392
+
393
+ ```Ruby
394
+
395
+ #encoding : utf-8
396
+
397
+ f = File.read("データ2.txt").encode("UTF-8").split("\n").map{|e| e.split("\,")}
398
+
399
+ f.shift
400
+
401
+ puts f.map{|y| [y[3], y[0], y[2]]}.sort.select{|g| g[2] == "女"}.map{|word| word[1] + word[0] + word[2]}[0]
402
+
403
+ puts f.map{|y| [y[3], y[0], y[2]]}.sort.select{|g| g[2] == "男"}.map{|word| word[1] + word[0] + word[2]}[0]
404
+
405
+ puts "---------------------------------------"
406
+
407
+ f.map!{|k| k[4]}.uniq.map{|e|[f.count(e), e]}.sort!.reverse!.map{|word| puts word[1] + word[0].to_s + "人"}
408
+
409
+ ```

11

修正

2017/01/07 11:15

投稿

退会済みユーザー
test CHANGED
@@ -294,11 +294,13 @@
294
294
 
295
295
  #13:rank.to_sでrankを文字にします。そうしないと文字と+できません。初めにファイルをUTF-8にエンコード
296
296
 
297
- # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にしたrankの後ろに
297
+ # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にした
298
-
298
+
299
- # スペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の2番目の要素=県名と
299
+ # rankの後ろにスペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の
300
+
300
-
301
+ # 2番目(配列の要素は0から数える)の要素=県名とken_count(配列)のnum番目にある要素(配列)
302
+
301
- # ken_count(配列)num番目にある要素(配列)の1番目の要素=人数を文字にしたものを足しています。
303
+ # の1番目の要素=人数を文字にしたものを足しています。
302
304
 
303
305
  num += 1 #14:numに1を足します。そうしないと2位以降が表示されなくなります。
304
306
 

10

補足

2017/01/07 01:36

投稿

退会済みユーザー
test CHANGED
@@ -296,9 +296,9 @@
296
296
 
297
297
  # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にしたrankの後ろに
298
298
 
299
- # スペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の1番目の要素=県名と
299
+ # スペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の2番目の要素=県名と
300
-
300
+
301
- # ken_count(配列)のnum番目にある要素(配列)の0番目の要素=人数を文字にしたものを足しています。
301
+ # ken_count(配列)のnum番目にある要素(配列)の1番目の要素=人数を文字にしたものを足しています。
302
302
 
303
303
  num += 1 #14:numに1を足します。そうしないと2位以降が表示されなくなります。
304
304
 

9

修正

2017/01/07 01:31

投稿

退会済みユーザー
test CHANGED
@@ -208,7 +208,7 @@
208
208
 
209
209
  =end
210
210
 
211
- f = File.read("ファイル名").encode("UTF-8").split("\n").map!{|e| e.split("\,")}
211
+ f = File.read("ファイル名").encode("UTF-8").split("\n").map{|e| e.split("\,")}
212
212
 
213
213
  =begin
214
214
 

8

修正

2017/01/06 20:23

投稿

退会済みユーザー
test CHANGED
@@ -358,7 +358,7 @@
358
358
 
359
359
  end
360
360
 
361
- if woman[0] != nil then #25:manの中身が空かどうかで処理を分けます。
361
+ if woman[0] != nil then #25:womanの中身が空かどうかで処理を分けます。
362
362
 
363
363
  puts "女性:" + woman[0][1] + woman[0][0]
364
364
 

7

修正

2017/01/06 20:20

投稿

退会済みユーザー
test CHANGED
@@ -198,11 +198,33 @@
198
198
 
199
199
  #encoding : utf-8
200
200
 
201
+ =begin
202
+
203
+ [1]について、私は単純にそれぞれの県の人数を数えて人数の多い順に並び替えることにしました。
204
+
205
+ [2]については、生年月日順に氏名を並び替えたのち、男女で分けて男の先頭と女の先頭を
206
+
207
+ 表示することにしました。
208
+
209
+ =end
210
+
201
211
  f = File.read("ファイル名").encode("UTF-8").split("\n").map!{|e| e.split("\,")}
202
212
 
213
+ =begin
214
+
215
+ #1:データの入ったメモ帳を読み込みます。手を加えやすいようにUTF-8にエンコードします。
216
+
217
+   このファイルは1行で一つのまとまりになっているのでいったん改行で分割<split("\n")>
218
+
219
+ します。このままだと1行がすべてくっついているので、くっついている1行を対象にカンマで分割
220
+
221
+ <split("\,")>します。
222
+
203
- ken = []
223
+ =end
204
-
224
+
205
- years = []
225
+ ken = [] #2:県名を入れる配列を作ります。
226
+
227
+ years = [] #3:氏名、生年月日、性別だけを1つにまとめた情報を入れる配列を作ります。
206
228
 
207
229
  f.each do |element|
208
230
 
@@ -212,34 +234,80 @@
212
234
 
213
235
  end
214
236
 
215
-
216
-
217
- ken_list = ken.uniq
237
+ =begin
218
-
238
+
219
- ken_count = []
239
+ #4:f(最初に読み込んだファイル)の中身(例:[佐藤 太郎,サトウ タロウ,男,,887-4155,宮城県,xx市,xx,3-50-5,xxマンション307,1982/06/09,O ]
220
-
240
+
221
- ken_list.each do |e|
241
+   順番にelementに入れて処理を行います。
242
+
243
+   処理の内容は2つあって、1つは県名をとってkenに入れるもの、もう1つは生年月日、氏名、性別をとってyearsに入れるものです。
244
+
245
+ =end
246
+
247
+
248
+
249
+ ken_list = ken.uniq #5:#4によって今、kenには県名が入っています。このkenから重複した県名を削除した新しい配列ken_listを作ります。
250
+
251
+ ken_count = [] #6:数えた県名の数(=その県名が含まれたデータの数)を入れておく配列を作ります。
252
+
253
+ ken_list.each do |e| #7:ken_listの中身(例:[沖縄県, 宮城県, 広島県])を順番にeに入れます。
222
254
 
223
255
  ken_count << [ken.count(e), e]
224
256
 
225
257
  end
226
258
 
259
+ =begin
260
+
261
+ #8:重複ありで県名が入っているkenを対象にe(個別の県名)の個数を調べます。その個数とe(個別の県名)を
262
+
263
+ ken_countに入れます。
264
+
265
+ =end
266
+
227
267
  ken_count.sort!.reverse!
228
268
 
269
+ =begin
270
+
271
+ #9:ken_countをsortします。sortをすると数字の小さい順に並べ替えられます。
272
+
273
+ 並び替えられた結果をreverseすることで数字を大きい順に並び替えることができます。
274
+
275
+ =end
276
+
229
277
  years.sort!
230
278
 
231
- num = 0
279
+ =begin
280
+
281
+ #10:ついでに氏名、生年月日、性別が入っているyearsもsortをします。
282
+
283
+ こちらは生年月日の古い順(=数字が小さい順)なのでsortだけで大丈夫です。
284
+
285
+ =end
286
+
287
+ num = 0 #11:県名と人数を数字の大きい順に5つ表示します。表示にはloopを使います。
232
288
 
233
289
  loop{
234
290
 
235
- rank = num + 1
291
+ rank = num + 1 #12:順位に使う数字です。numは0から始まるので1を足さないと順位が1位からになりません。
236
292
 
237
293
  puts rank.to_s + "\s" + ken_count[num][1] + ken_count[num][0].to_s + "人"
238
294
 
295
+ #13:rank.to_sでrankを文字にします。そうしないと文字と+できません。初めにファイルをUTF-8にエンコード
296
+
297
+ # しておかないとこの辺でエラーが出ると思います。画面に表示したときに見やすいように、文字にしたrankの後ろに
298
+
299
+ # スペースを入れます。その次にken_count(配列)のnum番目にある要素(配列)の1番目の要素=県名と
300
+
301
+ # ken_count(配列)のnum番目にある要素(配列)の0番目の要素=人数を文字にしたものを足しています。
302
+
239
- num += 1
303
+ num += 1 #14:numに1を足します。そうしないと2位以降が表示されなくなります。
240
304
 
241
305
  if num == 5 || num > ken_count.length - 1 then
242
306
 
307
+ #15:loopを抜ける処理を書いています。このloopはnum==5(numは0から始まっているので順位では6位)
308
+
309
+ # になるか、numがken_countの要素の数を超える(県名が5よりも少なかった場合用)と終了します。
310
+
243
311
  break
244
312
 
245
313
  end
@@ -248,46 +316,64 @@
248
316
 
249
317
 
250
318
 
251
- man = []
319
+ man = [] #16:男性を入れておく配列を作ります。
252
-
320
+
253
- woman = []
321
+ woman = [] #17:女性を入れておく配列を作ります。
254
322
 
255
323
  years.each do |date|
256
324
 
325
+ #18:氏名、生年月日、性別が入ったyearsの要素(例[[氏名1, xxxx/xx/xx, 男], [氏名2, xxxx/xx/xx, 女]]を
326
+
327
+ # 順番にdateに入れます。
328
+
257
- if date[2] == "男" then
329
+ if date[2] == "男" then #19:dateの3番目(配列の要素は0から数える)の要素が男なら
258
-
330
+
259
- man << date
331
+ man << date #20:manにdateを入れます
260
-
332
+
261
- elsif date[2] == "女" then
333
+ elsif date[2] == "女" then #21:dateの3番目(配列の要素は0から数える)の要素が女なら
262
-
334
+
263
- woman << date
335
+ woman << date #20:womanにdateを入れます
264
-
336
+
265
- end
337
+ end
266
-
338
+
267
- end
339
+ end
268
-
340
+
269
- puts "-------------------------------------------"
341
+ puts "-------------------------------------------" #21:少しでも見やすくなるように[1]で出した県名と人数ランキングの下に線を引きます。
270
-
342
+
271
- if man[0] != nil then
343
+ if man[0] != nil then #22:manの中身が空かどうかで処理を分けます。
272
344
 
273
345
  puts "男性:" + man[0][1] + man[0][0]
274
346
 
347
+ #23:空ではない場合は、男性か女性か分かりやすいように性別を表示することにして
348
+
349
+ # manの先頭の要素(配列)の2番目の要素(氏名)とmanの先頭の要素(配列)
350
+
351
+ # の1番目の要素(生年月日)を表示します。
352
+
275
353
  else
276
354
 
277
355
  puts "男性:該当者なし"
278
356
 
357
+ #24:空の場合は分かりやすいように"男性:該当者なし"と表示することにします。
358
+
279
- end
359
+ end
280
-
360
+
281
- if woman[0] != nil then
361
+ if woman[0] != nil then #25:manの中身が空かどうかで処理を分けます。
282
362
 
283
363
  puts "女性:" + woman[0][1] + woman[0][0]
284
364
 
365
+ #26:空ではない場合は、男性か女性か分かりやすいように性別を表示することにして
366
+
367
+ # womanの先頭の要素(配列)の2番目の要素(氏名)とwomanの先頭の要素(配列)
368
+
369
+ # の1番目の要素(生年月日)を表示します。
370
+
285
371
  else
286
372
 
287
373
  puts "女性:該当者なし"
288
374
 
375
+ #27:空の場合は分かりやすいように"女性:該当者なし"と表示することにします。
376
+
289
377
  end
290
378
 
291
379
  ```
292
-
293
-

6

修正

2017/01/06 20:15

投稿

退会済みユーザー
test CHANGED
@@ -104,6 +104,8 @@
104
104
 
105
105
  2017/01/06追記
106
106
 
107
+ 2017/01/07追記
108
+
107
109
  ```Ruby
108
110
 
109
111
  #encoding : utf-8
@@ -189,3 +191,103 @@
189
191
  ```
190
192
 
191
193
  同じ人数でも表示されるようになりました。
194
+
195
+
196
+
197
+ ```Ruby
198
+
199
+ #encoding : utf-8
200
+
201
+ f = File.read("ファイル名").encode("UTF-8").split("\n").map!{|e| e.split("\,")}
202
+
203
+ ken = []
204
+
205
+ years = []
206
+
207
+ f.each do |element|
208
+
209
+ ken << element[5]
210
+
211
+ years << [element[10], element[0], element[2]]
212
+
213
+ end
214
+
215
+
216
+
217
+ ken_list = ken.uniq
218
+
219
+ ken_count = []
220
+
221
+ ken_list.each do |e|
222
+
223
+ ken_count << [ken.count(e), e]
224
+
225
+ end
226
+
227
+ ken_count.sort!.reverse!
228
+
229
+ years.sort!
230
+
231
+ num = 0
232
+
233
+ loop{
234
+
235
+ rank = num + 1
236
+
237
+ puts rank.to_s + "\s" + ken_count[num][1] + ken_count[num][0].to_s + "人"
238
+
239
+ num += 1
240
+
241
+ if num == 5 || num > ken_count.length - 1 then
242
+
243
+ break
244
+
245
+ end
246
+
247
+ }
248
+
249
+
250
+
251
+ man = []
252
+
253
+ woman = []
254
+
255
+ years.each do |date|
256
+
257
+ if date[2] == "男" then
258
+
259
+ man << date
260
+
261
+ elsif date[2] == "女" then
262
+
263
+ woman << date
264
+
265
+ end
266
+
267
+ end
268
+
269
+ puts "-------------------------------------------"
270
+
271
+ if man[0] != nil then
272
+
273
+ puts "男性:" + man[0][1] + man[0][0]
274
+
275
+ else
276
+
277
+ puts "男性:該当者なし"
278
+
279
+ end
280
+
281
+ if woman[0] != nil then
282
+
283
+ puts "女性:" + woman[0][1] + woman[0][0]
284
+
285
+ else
286
+
287
+ puts "女性:該当者なし"
288
+
289
+ end
290
+
291
+ ```
292
+
293
+

5

補足

2017/01/06 19:24

投稿

退会済みユーザー
test CHANGED
@@ -101,3 +101,91 @@
101
101
  もしかしなくても意図した動きをしない可能性があります。
102
102
 
103
103
  同じ人数になった場合はどれか一つしか表示されません。
104
+
105
+ 2017/01/06追記
106
+
107
+ ```Ruby
108
+
109
+ #encoding : utf-8
110
+
111
+ f = File.read("ファイル名").encode("UTF-8").split("\n").map!{|e| e.split("\,")}
112
+
113
+ ken = []
114
+
115
+ years = []
116
+
117
+ f.each do |element|
118
+
119
+ ken << element[5]
120
+
121
+ years << element[10]
122
+
123
+ end
124
+
125
+
126
+
127
+ ken_list = ken.uniq
128
+
129
+ ken_count = []
130
+
131
+ ken_list.each do |e|
132
+
133
+ ken_count << [ken.count(e), e]
134
+
135
+ end
136
+
137
+ ken_count.sort!.reverse!
138
+
139
+
140
+
141
+ num = 0
142
+
143
+ loop{
144
+
145
+ rank = num + 1
146
+
147
+ puts rank.to_s + ken_count[num][1] + ken_count[num][0].to_s + "人"
148
+
149
+ num += 1
150
+
151
+ if num == 5 || num > ken_count.length - 1 then
152
+
153
+ break
154
+
155
+ end
156
+
157
+ }
158
+
159
+ years_sort = years.sort
160
+
161
+ man = []
162
+
163
+ woman = []
164
+
165
+ years_sort.each do |y|
166
+
167
+ name = f[years.index(y)][0]
168
+
169
+ year = f[years.index(y)][10]
170
+
171
+ sex = f[years.index(y)][2]
172
+
173
+ if sex == "男" then
174
+
175
+ man << [name + year + sex]
176
+
177
+ elsif sex == "女" then
178
+
179
+ woman << [name + year + sex]
180
+
181
+ end
182
+
183
+ end
184
+
185
+ puts man[0]
186
+
187
+ puts woman[0]
188
+
189
+ ```
190
+
191
+ 同じ人数でも表示されるようになりました。

4

修正

2017/01/06 11:50

投稿

退会済みユーザー
test CHANGED
@@ -100,4 +100,4 @@
100
100
 
101
101
  もしかしなくても意図した動きをしない可能性があります。
102
102
 
103
- 同じ人数になった場合などではどれか一つしか表示されないという欠陥があり
103
+ 同じ人数になった場合はどれか一つしか表示されません

3

補足

2017/01/06 10:33

投稿

退会済みユーザー
test CHANGED
@@ -99,3 +99,5 @@
99
99
  私はデータを持っていないので質問の最初に書いてある例を参考にして作りました。
100
100
 
101
101
  もしかしなくても意図した動きをしない可能性があります。
102
+
103
+ 同じ人数になった場合などではどれか一つしか表示されないという欠陥があります。

2

修正

2017/01/06 10:32

投稿

退会済みユーザー
test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  ken_sort
38
38
 
39
- ken_sort_new = ken_sort.sort
39
+ ken_sort_new = ken_sort.sort.reverse
40
40
 
41
41
 
42
42
 

1

修正

2017/01/06 10:28

投稿

退会済みユーザー
test CHANGED
@@ -54,7 +54,7 @@
54
54
 
55
55
  rank += 1
56
56
 
57
- if rank == 6 || rank > ken_list.length - 1 then
57
+ if rank == 5 || rank > ken_list.length - 1 then
58
58
 
59
59
  break
60
60