teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

文法の修正

2020/11/11 16:11

投稿

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

1

2020/11/11 16:11

投稿

退会済みユーザー
title CHANGED
@@ -1,1 +1,1 @@
1
- rubyzipで作成したファイルが解凍できない
1
+ ----------
body CHANGED
@@ -1,126 +1,3 @@
1
- ### 前提・実現したいこと
2
-
3
- csvファイルをUTF-8で複数作成し、rubyzipで出力したいです。
4
-
5
- ######できていること
6
- - csv単体での出力 (日本語、英語含む)
7
- - csv複数をzip化させ出力 (日本語、英語含む)
8
- - csv複数をzip化させ解凍 (英語のみ)
9
-
10
- ######できていないこと
11
- - csv複数をzip化させ解凍 (一部日本語含むファイル) ← 解凍できるときもある(「試したこと」に書きました。)
12
-
13
- ### 発生している問題・エラーメッセージ
14
-
15
- エクスプローラで下記アラートが表示され解凍できない。
16
- `フォルダーを開くことができません。
17
- 圧縮(zip形式)フォルダ'C:\Users\username\Downloads\sample.zip'は無効です。`
18
-
19
- ### 該当のソースコード
20
-
21
- ```ruby
22
- # Controller
23
- def export_csv
24
- session[:search] = piyo_search_params.to_h.presence || session[:search]
25
- @piyos = Piyo.search(session[:search])
26
- if session[:search]["post_type"].present?
27
- # CSV出力
28
- send_data @piyos.generate_csv(session[:search]["post_type"]), filename: "#{session[:search]["post_type"]}.csv"
29
- else
30
- # zip出力
31
- fullpath = @piyos.generate_zip
32
- send_data File.read(fullpath), filename: File.basename(fullpath), type: 'application/zip'
33
- File.delete(fullpath)
34
- end
35
- end
36
- ```
37
- ```ruby
38
- # Model
39
- POST_TYPE = [["ほげ", "hoge"], ["ふが", "huga"]]
40
- def self.csv_attributes_hoge
41
- {
42
- hoge_id: "ほげID",
43
- hoge_name: "名前",
44
- }
45
- end
46
- def self.csv_attributes_huga
47
- {
48
- huga_id: "ほげID",
49
- huga_name: "名前",
50
- huga_date: "日付",
51
- huga_type: "種別",
52
- huga_status: "ステータス",
53
- }
54
- end
55
-
56
- # zipファイル作成
57
- # == Returns:
58
- # fullpath
1
+ ----------
59
- def self.generate_zip(post_type="")
60
- require 'zip'
61
-
62
- csv_types = []
63
- if post_type.present?
64
- csv_types << post_type
65
- else
66
- csv_types = POST_TYPE.to_h.values
67
- end
68
- bom = "\uFEFF"
69
- filename = "sample.zip"
70
- fullpath = "#{Rails.root}/tmp/#{filename}"
71
- Zip::File.open(fullpath, Zip::File::CREATE) do |zipfile|
72
- csv_types.each do |csv_type|
73
- zipfile.get_output_stream("sample/#{csv_type}.csv") do |f|
74
- f.puts(self.generate_csv(csv_type))
75
- end
76
- end
77
- end
78
- return fullpath
79
- end
80
- # CSVファイル作成
81
- # == Returns:
82
- # csv
83
- def self.generate_csv(post_type="")
84
- require 'csv'
85
- bom = "\uFEFF"
86
- CSV.generate(bom) do |csv|
87
- column_names = self.send("csv_attributes_#{post_type}").values
88
- csv << column_names
89
- # zip形式対策のためもう一度検索
90
- self.where(post_type: post_type).each do |model|
91
- column_values = []
92
- self.send("csv_attributes_#{post_type}").keys.each do |key|
93
- column_values << model.send(key)
94
- end
95
- csv << column_values
96
- end
97
- end
98
- end
99
- ```
100
-
101
- ### 試したこと
102
-
103
- - bomを入れたが、日本語は解凍できず。
104
- - エンコードをUTF8にしたが、日本語は解凍できず。
105
- - 直接CSV項目を作成すると日本語も解凍できる。
106
- ```ruby
107
- bom = "\uFEFF"
108
- f.puts(
109
- CSV.generate(bom) do |csv|
110
- # NG
111
- csv << self.send("csv_attributes_#{csv_type}").values
112
- # OK
113
- csv << %w(- いいい 電話番号)
114
- end
115
- )
116
- # f.puts(self.generate_csv(csv_type))
117
- ```
118
-
119
-
120
- ### 補足情報(FW/ツールのバージョンなど)
121
-
122
- windows10
123
- ruby 2.6.6
2
+ ----------
124
- rails 5.2.3
3
+ ----------
125
-
126
- どうぞよろしくおねがいしますm(__)m