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

質問編集履歴

3

追加情報の記載

2019/07/13 16:53

投稿

morohey
morohey

スコア12

title CHANGED
File without changes
body CHANGED
@@ -34,4 +34,7 @@
34
34
  ```
35
35
 
36
36
 
37
- プログラミング初心者なもので非常に効率の悪いコードしか書けず、大変お恥ずかしいのですが、ご教授いただければ幸いです。
37
+ プログラミング初心者なもので非常に効率の悪いコードしか書けず、大変お恥ずかしいのですが、ご教授いただければ幸いです。
38
+
39
+ - **みなさま、ご回答ありがとうございました!**
40
+ どの方の回答も発見と驚きの連続で、ベストアンサーを決めるのが大変難しかったです。初心者のわたくしに、真摯に対応してくださり、大変感動しております。ありがとうございました。

2

書式の改善

2019/07/13 16:53

投稿

morohey
morohey

スコア12

title CHANGED
File without changes
body CHANGED
@@ -15,7 +15,7 @@
15
15
  [6,'F']
16
16
  ];
17
17
  ```
18
- - **実現したいCSV形式**
18
+ - **実現したい表(CSV形式**
19
19
  |data1-num|data1-alpha|data2-num|data2-alpha|
20
20
  |:--:|:--:|:--:|:--:|
21
21
  |1|"A"|4|"D"|

1

書式の改善

2019/07/12 16:38

投稿

morohey
morohey

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- 複数の配列をまとめてCSV出力する方法について
1
+ 複数の配列データ一つにまとめる方法について
body CHANGED
@@ -1,101 +1,8 @@
1
+ - **前提・実現したいこと **
1
- 複数の配列をまとめCSVに出力するコードを書いています。
2
+ JavaScriptで、複数の配列データ一つのデータにまとめCSVに出力するコードを書いています。
2
-
3
- CSVに出力するコードは、[JavaScript のデータを CSV で保存する](https://blog.mudatobunka.org/entry/2017/04/23/135753)を参考にしています。
3
+ CSVに出力するためのコードは、[JavaScript のデータを CSV で保存する内容](https://blog.mudatobunka.org/entry/2017/04/23/135753) を参考にしています。
4
+ 今回、自分が出力したい配列データは以下の通りです。
4
5
  ```
5
- class CSV {
6
- constructor(data, keys = false) {
7
- this.ARRAY = Symbol('ARRAY')
8
- this.OBJECT = Symbol('OBJECT')
9
-
10
- this.data = data
11
-
12
- if (CSV.isArray(data)) {
13
- if (0 == data.length) {
14
- this.dataType = this.ARRAY
15
- } else if (CSV.isObject(data[0])) {
16
- this.dataType = this.OBJECT
17
- } else if (CSV.isArray(data[0])) {
18
- this.dataType = this.ARRAY
19
- } else {
20
- throw Error('Error: 未対応のデータ型です')
21
- }
22
- } else {
23
- throw Error('Error: 未対応のデータ型です')
24
- }
25
-
26
- this.keys = keys
27
- }
28
-
29
- toString() {
30
- if (this.dataType === this.ARRAY) {
31
- return this.data.map((record) => (
32
- record.map((field) => (
33
- CSV.prepare(field)
34
- )).join(',')
35
- )).join('\n')
36
- } else if (this.dataType === this.OBJECT) {
37
- const keys = this.keys || Array.from(this.extractKeys(this.data))
38
-
39
- const arrayData = this.data.map((record) => (
40
- keys.map((key) => record[key])
41
- ))
42
-
43
- console.log([].concat([keys], arrayData))
44
-
45
- return [].concat([keys], arrayData).map((record) => (
46
- record.map((field) => (
47
- CSV.prepare(field)
48
- )).join(',')
49
- )).join('\n')
50
- }
51
- }
52
-
53
- save(filename = 'data.csv') {
54
- if (!filename.match(/.csv$/i)) { filename = filename + '.csv' }
55
-
56
- console.info('filename:', filename)
57
- console.table(this.data)
58
-
59
- const csvStr = this.toString()
60
-
61
- const bom = new Uint8Array([0xEF, 0xBB, 0xBF]);
62
- const blob = new Blob([bom, csvStr], {'type': 'text/csv'});
63
- const url = window.URL || window.webkitURL;
64
- const blobURL = url.createObjectURL(blob);
65
-
66
- let a = document.createElement('a');
67
- a.download = decodeURI(filename);
68
- a.href = blobURL;
69
- a.type = 'text/csv';
70
-
71
- a.click();
72
- }
73
-
74
- extractKeys(data) {
75
- return new Set([].concat(...this.data.map((record) => Object.keys(record))))
76
- }
77
-
78
- static prepare(field) {
79
- return '"' + (''+field).replace(/"/g, '""') + '"'
80
- }
81
-
82
- static isObject(obj) {
83
- return '[object Object]' === Object.prototype.toString.call(obj)
84
- }
85
-
86
- static isArray(obj) {
87
- return '[object Array]' === Object.prototype.toString.call(obj)
88
- }
89
- }
90
- ```
91
- ```
92
- (new CSV(data)).save('foobar.csv') //CSVに出力
93
- ```
94
-
95
-
96
-
97
- 出力したい配列データは以下の通りです。
98
- ```
99
6
  var data1 = [
100
7
  [1,'A'],
101
8
  [2,'B'],
@@ -108,16 +15,16 @@
108
15
  [6,'F']
109
16
  ];
110
17
  ```
111
- これらの複数データを、まとめて下記の表のようにcsv出力したいのですが、うまくコードが書けません。
18
+ - **実現したいCSV形式**
112
-
113
19
  |data1-num|data1-alpha|data2-num|data2-alpha|
114
20
  |:--:|:--:|:--:|:--:|
115
- |1|A|4|D|
21
+ |1|"A"|4|"D"|
116
- |2|B|5|E|
22
+ |2|"B"|5|"E"|
117
- |3|C|6|F|
23
+ |3|"C"|6|"F"|
118
24
 
119
25
 
26
+ - **改善したい点**
120
- 以下のコードで実行できるのですが、もっと良い書き方はないでしょうか。
27
+ 上記の二つの配列データを一つのデータにまとめるにあたり、以下のコードを書いたのですが、配列の要素数が多くなって対応できるような、もっと簡潔な書き方はないでしょうか。
121
28
  ```
122
29
  var data = [
123
30
  {'data1-num': data1[0][0],'data1-alpha': data1[0][1],'data2-num': data2[0][0],'data2-alpha': data2[0][1]},
@@ -125,4 +32,6 @@
125
32
  {'data1-num': data1[2][0],'data1-alpha': data1[2][1],'data2-num': data2[2][0],'data2-alpha': data2[2][1]},
126
33
  ];
127
34
  ```
35
+
36
+
128
37
  プログラミング初心者なもので非常に効率の悪いコードしか書けず、大変お恥ずかしいのですが、ご教授いただければ幸いです。