回答編集履歴

7

a

2016/03/29 19:04

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -1,6 +1,8 @@
1
1
  - [Hash#keysの順番は保証されるのか?](http://qiita.com/ongaeshi/items/a57b6ab166b3c4bc360d)
2
2
 
3
3
  - [class CSV (Ruby 2.1.0)](http://docs.ruby-lang.org/ja/2.1.0/class/CSV.html)
4
+
5
+ - [Excelですぐ開けるUnicodeなCSVをRubyで生成する](http://d.akiroom.com/2014-01/excel-unicode-utf-csv-ruby/)
4
6
 
5
7
 
6
8
 
@@ -15,6 +17,8 @@
15
17
  - 日本語がExcelで化けないように,先頭3バイトとしてBOMを付与しています.
16
18
 
17
19
  - 日本語がMac版のExcelでも化けないように,文字コードはUTF-8ではなくUTF-16LEにしました.
20
+
21
+ - 一度文字列としてUTF-8のCSVを生成してからまとめて書き込んだほうがコード量は少なくなりますが,大量のデータを一度に書き込む際に困るため,逐次文字コードをUTF-16LEに変換しながら1行ずつ書き込んでいく書き方にしました.
18
22
 
19
23
 
20
24
 

6

a

2016/03/29 19:04

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -10,7 +10,11 @@
10
10
 
11
11
  - ハッシュのキーを文字列で定義する意味は薄いのでシンボル使いました.もしここが変更出来ない場合は`map`に使っているシンボルの配列に関しても,シンボルではなく文字列にしてください.
12
12
 
13
+ - Excelで一発で開けるように,コンマ区切りではなくタブ区切りにしました.
14
+
15
+ - 日本語がExcelで化けないように,先頭3バイトとしてBOMを付与しています.
16
+
13
- - Mac版のExcelでもように文字コードはUTF-16LEにしました.
17
+ - 日本語がMac版のExcelでもないように文字コードはUTF-8ではなくUTF-16LEにしました.
14
18
 
15
19
 
16
20
 
@@ -24,9 +28,9 @@
24
28
 
25
29
  birthday: '2016/05/28',
26
30
 
27
- family_name: 'sasaki',
31
+ family_name: '佐々木',
28
32
 
29
- last_name: 'taro',
33
+ last_name: '太郎',
30
34
 
31
35
  }
32
36
 
@@ -62,9 +66,9 @@
62
66
 
63
67
  birthday: '2016/05/28',
64
68
 
65
- family_name: 'sasaki',
69
+ family_name: '佐々木',
66
70
 
67
- last_name: 'taro',
71
+ last_name: '太郎',
68
72
 
69
73
  }
70
74
 
@@ -86,4 +90,4 @@
86
90
 
87
91
 
88
92
 
89
- ちなみにダブルクオーテーションに関してですが,文字列が改行や`,`を含んでいたりして**必要なときだけ括る**という処理になるかと思います.
93
+ ちなみにダブルクオーテーションに関してですが,文字列が改行などを含んでいたりして**必要なときだけ括る**という処理になるかと思います.

5

UTF-16E対応

2016/03/29 18:48

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -4,7 +4,13 @@
4
4
 
5
5
 
6
6
 
7
+ 全バージョン共通です.
8
+
9
+
10
+
7
- 全バージョン共通です.ハッシュのキーを文字列で定義する意味は薄いのでシンボル使いました.もしここが変更出来ない場合は`map`に使っているシンボルの配列に関しても,シンボルではなく文字列にしてください.
11
+ - ハッシュのキーを文字列で定義する意味は薄いのでシンボル使いました.もしここが変更出来ない場合は`map`に使っているシンボルの配列に関しても,シンボルではなく文字列にしてください.
12
+
13
+ - Mac版のExcelでも開けるように文字コードはUTF-16LEにしました.
8
14
 
9
15
 
10
16
 
@@ -26,9 +32,15 @@
26
32
 
27
33
 
28
34
 
29
- CSV.open('data.csv', 'wb') do |csv|
35
+ File.open('data.csv', 'wb:UTF-16LE') do |file|
30
36
 
37
+ file.write "\uFEFF"
38
+
39
+ CSV.open(file, 'wb:UTF-16LE', col_sep: "\t") do |csv|
40
+
31
- csv << [:birthday, :family_name, :last_name].map{|key| hash[key]}
41
+ csv << [:birthday, :family_name, :last_name].map{|k| hash[k].encode('UTF-16LE')}
42
+
43
+ end
32
44
 
33
45
  end
34
46
 
@@ -58,9 +70,15 @@
58
70
 
59
71
 
60
72
 
61
- CSV.open('data.csv', 'wb') do |csv|
73
+ File.open('data.csv', 'wb:UTF-16LE') do |file|
62
74
 
75
+ file.write "\uFEFF"
76
+
77
+ CSV.open(file, 'wb:UTF-16LE', col_sep: "\t") do |csv|
78
+
63
- csv << hash.values
79
+ csv << hash.values.map{|v| v.encode('UTF-16LE')}
80
+
81
+ end
64
82
 
65
83
  end
66
84
 

4

a

2016/03/29 18:44

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -68,4 +68,4 @@
68
68
 
69
69
 
70
70
 
71
- ちなみにダブルクオーテーションに関してですが,文字列が空白や改行を含んでいたりして**必要なときだけ括る**という処理になるかと思います.
71
+ ちなみにダブルクオーテーションに関してですが,文字列が改行や`,`を含んでいたりして**必要なときだけ括る**という処理になるかと思います.

3

a

2016/03/29 17:54

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- 全バージョン共通
7
+ 全バージョン共通です.ハッシュのキーを文字列で定義する意味は薄いのでシンボル使いました.もしここが変更出来ない場合は`map`に使っているシンボルの配列に関しても,シンボルではなく文字列にしてください.
8
8
 
9
9
 
10
10
 

2

a

2016/03/29 17:49

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -65,3 +65,7 @@
65
65
  end
66
66
 
67
67
  ```
68
+
69
+
70
+
71
+ ちなみにダブルクオーテーションに関してですが,文字列が空白や改行を含んでいたりして**必要なときだけ括る**という処理になるかと思います.

1

a

2016/03/29 17:47

投稿

mpyw
mpyw

スコア5223

test CHANGED
@@ -9,6 +9,10 @@
9
9
 
10
10
 
11
11
  ```ruby
12
+
13
+ require 'csv'
14
+
15
+
12
16
 
13
17
  hash = {
14
18
 
@@ -38,6 +42,10 @@
38
42
 
39
43
  ```ruby
40
44
 
45
+ require 'csv'
46
+
47
+
48
+
41
49
  hash = {
42
50
 
43
51
  birthday: '2016/05/28',