前提・実現したいこと
JavaScriptを使い、CSVをJSONに変換したく、調べていたところ、以下のサイトでコードが紹介されていました。
紹介されていたサイト
https://shanabrian.com/web/javascript/csv-to-json.php
コードの中をしっかり理解したく読み解いていたのですが、1点分からないことがあり、
質問をさせて頂きました。
変換したいCSVと実行する内容
まず変換したいCSVは以下とします。
csv
1a, aa, aaa 2b, bb, bbb
このCSVは、変数csvStr
に格納させます。
そして、このCSV(csvStr
)を後述するcsvToJson()
関数でJSONに変換します。
この時に、関数に指定するオプションで、CSVのカラム名を付ける事ができます。
よって、関数実行は以下のように行います。
javascript
1csvToJson(csvStr, {columnName:['ID', '内容', '備考']});
CSVをJSONに変換する関数定義
CSVをJSONに変換する関数csvToJson()
のコードは以下です。
javascript
1var csvToJson = function(csvStr, userOptions) { 2 if (typeof csvStr !== 'string') return null; 3 4 var options = { header : 0, columnName : [], ignoreBlankLine : true }; 5 6 if (userOptions) { 7 if (userOptions.header) options.header = userOptions.header; 8 if (userOptions.columnName) options.columnName = userOptions.columnName; 9 } 10 11 var rows = csvStr.split('\n'); 12 var json = [], line = [], row = '', data = {}; 13 var i, len, j, len2; 14 15 for (i = 0, len = rows.length; i < len; i++) { 16 if ((i + 1) <= options.header) continue; 17 if (options.ignoreBlankLine && rows[i] === '') continue; 18 19 line = rows[i].split(','); 20 21 if (options.columnName.length > 0) { 22 data = {}; // ここでdata配列を空にしないと、同じ値が出力される。 23 for (j = 0, len2 = options.columnName.length; j < len2; j++) { 24 if (typeof line[j] !== 'undefined') { 25 row = line[j]; 26 row = row.replace(/^"(.+)?"$/, '$1'); 27 } else { 28 row = null; 29 } 30 31 data[options.columnName[j]] = row; 32 } 33 json.push(data); 34 } else { 35 json.push(line); 36 } 37 } 38 39 return json; 40};
お知恵を拝借したい点
上記関数のif (options.columnName.length > 0)
のブロックで、CSVのカラム名が引数で指定されている際の処理が記述されています。
このブロックにコメントをしているのですが、data = {}; // ここでdata配列を空にしないと、同じ値が出力される。
の箇所で、data
を空にしないと、同じ値が出力されてしまいます。
これの理由を知りたく、質問させて頂きました。
どうにも分からずでして…。
これdata = {};
があると、最終的にjson
は以下のように出力されます。
json
10: {ID: "a", 内容: "aa", 備考: "aaa"} 21: {ID: "b", 内容: "bb", 備考: "bbb"}
しかし、ないと以下のように出力されます。
json
10: {ID: "a", 内容: "aa", 備考: "aaa"} 21: {ID: "a", 内容: "aa", 備考: "aaa"} // 同じ内容が出力される
変数data
は、関数定義の冒頭で次のように既に宣言されています。
javascript
1var json = [], line = [], row = '', data = {};
そのため、あえてifブロックの中でdata = {}; // ここでdata配列を空にしないと、同じ値が出力される。
を書かなくてもよいのかなと思ったのですが、そうではないらしく。
これがないとどうして同じ値が出力されてしまうのか、理解できておらず、お知恵を拝借頂けますと有難いです。
どうぞよろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/22 15:19
2020/12/22 16:30
2020/12/23 08:42