質問編集履歴

3

追加情報の記載

2019/07/13 16:53

投稿

morohey
morohey

スコア12

test CHANGED
File without changes
test CHANGED
@@ -71,3 +71,9 @@
71
71
 
72
72
 
73
73
  プログラミング初心者なもので非常に効率の悪いコードしか書けず、大変お恥ずかしいのですが、ご教授いただければ幸いです。
74
+
75
+
76
+
77
+ - **みなさま、ご回答ありがとうございました!**
78
+
79
+ どの方の回答も発見と驚きの連続で、ベストアンサーを決めるのが大変難しかったです。初心者のわたくしに、真摯に対応してくださり、大変感動しております。ありがとうございました。

2

書式の改善

2019/07/13 16:53

投稿

morohey
morohey

スコア12

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ```
34
34
 
35
- - **実現したいCSV形式**
35
+ - **実現したい表(CSV形式**
36
36
 
37
37
  |data1-num|data1-alpha|data2-num|data2-alpha|
38
38
 

1

書式の改善

2019/07/12 16:38

投稿

morohey
morohey

スコア12

test CHANGED
@@ -1 +1 @@
1
- 複数の配列をまとめてCSV出力する方法について
1
+ 複数の配列データ一つにまとめる方法について
test CHANGED
@@ -1,196 +1,10 @@
1
- 複数の配列をまめてCSVに出力するコードを書いています。
1
+ - **前提・実現したいこ **
2
2
 
3
+ JavaScriptで、複数の配列データを一つのデータにまとめ、CSVに出力するコードを書いています。
3
4
 
5
+ CSVに出力するためのコードは、[JavaScript のデータを CSV で保存する内容](https://blog.mudatobunka.org/entry/2017/04/23/135753) を参考にしています。
4
6
 
5
- CSVに出力するコードは、[JavaScript のデータを CSV で保存する](https://blog.mudatobunka.org/entry/2017/04/23/135753)を参考にしています。
6
-
7
- ```
8
-
9
- class CSV {
10
-
11
- constructor(data, keys = false) {
12
-
13
- this.ARRAY = Symbol('ARRAY')
14
-
15
- this.OBJECT = Symbol('OBJECT')
16
-
17
-
18
-
19
- this.data = data
20
-
21
-
22
-
23
- if (CSV.isArray(data)) {
24
-
25
- if (0 == data.length) {
26
-
27
- this.dataType = this.ARRAY
28
-
29
- } else if (CSV.isObject(data[0])) {
30
-
31
- this.dataType = this.OBJECT
32
-
33
- } else if (CSV.isArray(data[0])) {
34
-
35
- this.dataType = this.ARRAY
36
-
37
- } else {
38
-
39
- throw Error('Error: 未対応のデータ型です')
40
-
41
- }
42
-
43
- } else {
44
-
45
- throw Error('Error: 未対応のデータ型です')
46
-
47
- }
48
-
49
-
50
-
51
- this.keys = keys
52
-
53
- }
54
-
55
-
56
-
57
- toString() {
58
-
59
- if (this.dataType === this.ARRAY) {
60
-
61
- return this.data.map((record) => (
62
-
63
- record.map((field) => (
64
-
65
- CSV.prepare(field)
66
-
67
- )).join(',')
68
-
69
- )).join('\n')
70
-
71
- } else if (this.dataType === this.OBJECT) {
72
-
73
- const keys = this.keys || Array.from(this.extractKeys(this.data))
74
-
75
-
76
-
77
- const arrayData = this.data.map((record) => (
78
-
79
- keys.map((key) => record[key])
80
-
81
- ))
82
-
83
-
84
-
85
- console.log([].concat([keys], arrayData))
86
-
87
-
88
-
89
- return [].concat([keys], arrayData).map((record) => (
90
-
91
- record.map((field) => (
92
-
93
- CSV.prepare(field)
94
-
95
- )).join(',')
96
-
97
- )).join('\n')
98
-
99
- }
100
-
101
- }
102
-
103
-
104
-
105
- save(filename = 'data.csv') {
106
-
107
- if (!filename.match(/.csv$/i)) { filename = filename + '.csv' }
108
-
109
-
110
-
111
- console.info('filename:', filename)
112
-
113
- console.table(this.data)
114
-
115
-
116
-
117
- const csvStr = this.toString()
118
-
119
-
120
-
121
- const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
122
-
123
- const blob = new Blob([bom, csvStr], {'type': 'text/csv'});
124
-
125
- const url = window.URL || window.webkitURL;
126
-
127
- const blobURL = url.createObjectURL(blob);
128
-
129
-
130
-
131
- let a = document.createElement('a');
132
-
133
- a.download = decodeURI(filename);
134
-
135
- a.href = blobURL;
136
-
137
- a.type = 'text/csv';
138
-
139
-
140
-
141
- a.click();
142
-
143
- }
144
-
145
-
146
-
147
- extractKeys(data) {
148
-
149
- return new Set([].concat(...this.data.map((record) => Object.keys(record))))
150
-
151
- }
152
-
153
-
154
-
155
- static prepare(field) {
156
-
157
- return '"' + (''+field).replace(/"/g, '""') + '"'
158
-
159
- }
160
-
161
-
162
-
163
- static isObject(obj) {
164
-
165
- return '[object Object]' === Object.prototype.toString.call(obj)
166
-
167
- }
168
-
169
-
170
-
171
- static isArray(obj) {
172
-
173
- return '[object Array]' === Object.prototype.toString.call(obj)
174
-
175
- }
176
-
177
- }
178
-
179
- ```
180
-
181
- ```
182
-
183
- (new CSV(data)).save('foobar.csv') //CSVに出力
184
-
185
- ```
186
-
187
-
188
-
189
-
190
-
191
-
192
-
193
- 出力したい配列データは以下の通りです。
7
+ 今回、自分が出力したい配列データは以下の通りです。
194
8
 
195
9
  ```
196
10
 
@@ -218,25 +32,25 @@
218
32
 
219
33
  ```
220
34
 
221
- これらの複数データを、まとめて下記の表のようにcsv出力したいのですが、うまくコードが書けません。
35
+ - **実現したいCSV形式**
222
-
223
-
224
36
 
225
37
  |data1-num|data1-alpha|data2-num|data2-alpha|
226
38
 
227
39
  |:--:|:--:|:--:|:--:|
228
40
 
229
- |1|A|4|D|
41
+ |1|"A"|4|"D"|
230
42
 
231
- |2|B|5|E|
43
+ |2|"B"|5|"E"|
232
44
 
233
- |3|C|6|F|
45
+ |3|"C"|6|"F"|
234
46
 
235
47
 
236
48
 
237
49
 
238
50
 
51
+ - **改善したい点**
52
+
239
- 以下のコードで実行できるのですが、もっと良い書き方はないでしょうか。
53
+ 上記の二つの配列データを一つのデータにまとめるにあたり、以下のコードを書いたのですが、配列の要素数が多くなって対応できるような、もっと簡潔な書き方はないでしょうか。
240
54
 
241
55
  ```
242
56
 
@@ -252,4 +66,8 @@
252
66
 
253
67
  ```
254
68
 
69
+
70
+
71
+
72
+
255
73
  プログラミング初心者なもので非常に効率の悪いコードしか書けず、大変お恥ずかしいのですが、ご教授いただければ幸いです。