質問編集履歴

2

文法の修正

2020/11/11 16:11

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- ----------
1
+ CSV出力ができない
test CHANGED
@@ -1,5 +1,33 @@
1
- ----------
1
+ ### 前提・実現したいこと
2
2
 
3
- ----------
3
+ csvファイルを作成し、出力したいのですがCSVが作れません。
4
4
 
5
+
6
+
7
+ ```ruby
8
+
9
+ CSV.generate do |csv|
10
+
11
+ csv = %w(name age Email)
12
+
13
+ all.each do |model|
14
+
15
+ column_values = [
16
+
17
+ model.name,
18
+
5
- ----------
19
+ model.age,
20
+
21
+ model.email
22
+
23
+ ]
24
+
25
+ csv << column_values
26
+
27
+ end
28
+
29
+ ```
30
+
31
+
32
+
33
+ よろしくお願いします。

1

2020/11/11 16:11

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- rubyzipで作成したファイルが解凍できない
1
+ ----------
test CHANGED
@@ -1,251 +1,5 @@
1
- ### 前提・実現したいこと
1
+ ----------
2
2
 
3
+ ----------
3
4
 
4
-
5
- csvファイルをUTF-8で複数作成し、rubyzipで出力したいです。
6
-
7
-
8
-
9
- ######できていること
10
-
11
- - csv単体での出力 (日本語、英語含む)
12
-
13
- - csv複数をzip化させ出力 (日本語、英語含む)
14
-
15
- - csv複数をzip化させ解凍 (英語のみ)
16
-
17
-
18
-
19
- ######できていないこと
20
-
21
- - csv複数をzip化させ解凍 (一部日本語含むファイル) ← 解凍できるときもある(「試したこと」に書きました。)
22
-
23
-
24
-
25
- ### 発生している問題・エラーメッセージ
26
-
27
-
28
-
29
- エクスプローラで下記アラートが表示され解凍できない。
30
-
31
- `フォルダーを開くことができません。
32
-
33
- 圧縮(zip形式)フォルダ'C:\Users\username\Downloads\sample.zip'は無効です。`
34
-
35
-
36
-
37
- ### 該当のソースコード
38
-
39
-
40
-
41
- ```ruby
42
-
43
- # Controller
44
-
45
- def export_csv
46
-
47
- session[:search] = piyo_search_params.to_h.presence || session[:search]
48
-
49
- @piyos = Piyo.search(session[:search])
50
-
51
- if session[:search]["post_type"].present?
52
-
53
- # CSV出力
54
-
55
- send_data @piyos.generate_csv(session[:search]["post_type"]), filename: "#{session[:search]["post_type"]}.csv"
56
-
57
- else
58
-
59
- # zip出力
60
-
61
- fullpath = @piyos.generate_zip
62
-
63
- send_data File.read(fullpath), filename: File.basename(fullpath), type: 'application/zip'
64
-
65
- File.delete(fullpath)
66
-
67
- end
68
-
69
- end
70
-
71
- ```
72
-
73
- ```ruby
74
-
75
- # Model
76
-
77
- POST_TYPE = [["ほげ", "hoge"], ["ふが", "huga"]]
78
-
79
- def self.csv_attributes_hoge
80
-
81
- {
82
-
83
- hoge_id: "ほげID",
84
-
85
- hoge_name: "名前",
86
-
87
- }
88
-
89
- end
90
-
91
- def self.csv_attributes_huga
92
-
93
- {
94
-
95
- huga_id: "ほげID",
96
-
97
- huga_name: "名前",
98
-
99
- huga_date: "日付",
100
-
101
- huga_type: "種別",
102
-
103
- huga_status: "ステータス",
104
-
105
- }
106
-
107
- end
108
-
109
-
110
-
111
- # zipファイル作成
112
-
113
- # == Returns:
114
-
115
- # fullpath
5
+ ----------
116
-
117
- def self.generate_zip(post_type="")
118
-
119
- require 'zip'
120
-
121
-
122
-
123
- csv_types = []
124
-
125
- if post_type.present?
126
-
127
- csv_types << post_type
128
-
129
- else
130
-
131
- csv_types = POST_TYPE.to_h.values
132
-
133
- end
134
-
135
- bom = "\uFEFF"
136
-
137
- filename = "sample.zip"
138
-
139
- fullpath = "#{Rails.root}/tmp/#{filename}"
140
-
141
- Zip::File.open(fullpath, Zip::File::CREATE) do |zipfile|
142
-
143
- csv_types.each do |csv_type|
144
-
145
- zipfile.get_output_stream("sample/#{csv_type}.csv") do |f|
146
-
147
- f.puts(self.generate_csv(csv_type))
148
-
149
- end
150
-
151
- end
152
-
153
- end
154
-
155
- return fullpath
156
-
157
- end
158
-
159
- # CSVファイル作成
160
-
161
- # == Returns:
162
-
163
- # csv
164
-
165
- def self.generate_csv(post_type="")
166
-
167
- require 'csv'
168
-
169
- bom = "\uFEFF"
170
-
171
- CSV.generate(bom) do |csv|
172
-
173
- column_names = self.send("csv_attributes_#{post_type}").values
174
-
175
- csv << column_names
176
-
177
- # zip形式対策のためもう一度検索
178
-
179
- self.where(post_type: post_type).each do |model|
180
-
181
- column_values = []
182
-
183
- self.send("csv_attributes_#{post_type}").keys.each do |key|
184
-
185
- column_values << model.send(key)
186
-
187
- end
188
-
189
- csv << column_values
190
-
191
- end
192
-
193
- end
194
-
195
- end
196
-
197
- ```
198
-
199
-
200
-
201
- ### 試したこと
202
-
203
-
204
-
205
- - bomを入れたが、日本語は解凍できず。
206
-
207
- - エンコードをUTF8にしたが、日本語は解凍できず。
208
-
209
- - 直接CSV項目を作成すると日本語も解凍できる。
210
-
211
- ```ruby
212
-
213
- bom = "\uFEFF"
214
-
215
- f.puts(
216
-
217
- CSV.generate(bom) do |csv|
218
-
219
- # NG
220
-
221
- csv << self.send("csv_attributes_#{csv_type}").values
222
-
223
- # OK
224
-
225
- csv << %w(- いいい 電話番号)
226
-
227
- end
228
-
229
- )
230
-
231
- # f.puts(self.generate_csv(csv_type))
232
-
233
- ```
234
-
235
-
236
-
237
-
238
-
239
- ### 補足情報(FW/ツールのバージョンなど)
240
-
241
-
242
-
243
- windows10
244
-
245
- ruby 2.6.6
246
-
247
- rails 5.2.3
248
-
249
-
250
-
251
- どうぞよろしくおねがいしますm(__)m