質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

9875閲覧

csvデータを読み込む際に空の行、,,,,,, だけの行を削除して取り込みたい。

k.taka_cam

総合スコア15

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2019/01/13 08:46

編集2019/01/13 08:50

前提・実現したいこと

JSを使ってCSVを取り込むプログラムを書きました。
このプログラムでCSVデータの取り込むことが出来たのですが、2点問題があります。

  1. csvデータを読み込む際に、文中や文末に発生した空の行を削除したい。
  2. CSVデータを読み込む際に、,,,,,, だけ発生している行を削除したい。

どうしても、CSVファイルを読み込み時に行う処理がわかりません。

ご教授頂けましたら幸いです。

該当のソースコード

Javascript

1jQuery.noConflict(); 2(function ($) { 3 "use strict"; 4 kintone.events.on(['app.record.index.show'], function (event) { 5 var appId = event.appId; 6 $('#selfile').bind('change', function (evt) { 7 var reader = new FileReader();; 8 var filedata = evt.target.files[0]; 9 reader.readAsText(filedata); 10 reader.onerror = function () { 11 alert('ファイル読み取りに失敗しました') 12 } 13 reader.onload = function (ev) { 14 if (!filedata.name.match('.csv$')) { 15 alert('CSVファイルを選択してください'); 16 return; 17 } else { 18 $('textarea[name=\"txt\"]').val(reader.result); 19 } 20 }; 21 }); 22 $('#post_btn').bind('click', function () { 23 var text_val = $('textarea[name=\"txt\"]').val(); 24 text_val = text_val.replace(/"/g, ""); 25 var jsonArray = csv2json(text_val.split('\n')); 26 27 var obj = []; 28 for (var i = 0; i < jsonArray.length; i++) { 29 obj[i] = { 30 updateKey: { 31 field: 'quote_number', 32 value: jsonArray[i]['test1'] 33 }, 34 record: { 35 '文字列': { 36 value: jsonArray[i]['test2'] 37 }, 38 'amount': { 39 value: jsonArray[i]['test3'] 40 }, 41 '数値A': { 42 value: jsonArray[i]['test4'] 43 }, 44 '数値B': { 45 value: jsonArray[i]['test5'] 46 }, 47 } 48 }; 49 var param = { 50 app: appId, 51 records: obj, 52 isGuest: false 53 }; 54 } 55 var obj_len = Object.keys(obj).length; 56 var spinner = new kintoneUIComponent.Spinner(); 57 var body = document.getElementsByTagName("BODY")[0]; 58 body.appendChild(spinner.render()); 59 if (window.confirm(obj_len + '件のデータを登録します。よろしいでしょうか?')) { 60 spinner.show(); 61 kintoneUtility.rest.upsertRecords(param).then(function (resp) { 62 spinner.hide(); 63 window.alert('取り込みが完了いたしました') 64 location.href = 'https://devowqnme.cybozu.com/k/1/'; 65 }).catch(function (error) { 66 console.log(error.message); 67 }) 68 } else { 69 window.alert('キャンセルされました'); 70 } 71 }); 72 function csv2json(csvArray) { 73 var jsonArray = []; 74 var items = csvArray[0].split(','); 75 for (var i = 1; i < csvArray.length; i++) { 76 var a_line = {}; 77 var csvArrayD = csvArray[i].split(','); 78 for (var j = 0; j < items.length; j++) { 79 a_line[items[j]] = csvArrayD[j]; 80 } 81 jsonArray.push(a_line); 82 } 83 return jsonArray; 84 } 85 }); 86})(jQuery);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NozomuIkuta

2019/01/13 09:00

削除したい行は「,,,,,,,」のようにカンマだけが存在する行ですか? 「, , , , , ,」のように空白文字(スペース)を含んだ行は削除対象ですか?
k.taka_cam

2019/01/13 09:05

NozomuIkuta 様 ご連絡有難うございます。 >削除したい行は「,,,,,,,」のようにカンマだけが存在する行ですか? カンマだけが存在する行を削除したいです。 >「, , , , , ,」のように空白文字(スペース)を含んだ行は削除対象ですか? はい。書きそびれてしまいました。削除対象になります。
guest

回答2

0

正規表現を使って文字列の一致を確かめれば、判定できます。
正規表現の判定をする関数はいろいろありますが、今回はRegExp.prototype.test()メソッドを使います。
「カンマまたは空白文字のみの行」は/^[,\s]*$/のように表現できます。

正規表現意味
^行頭を表す正規表現
[abc]「a」「b」「c」のいずれかの文字にマッチする正規表現
\s空白文字を表す正規表現
*直前の文字(文字グループ)の0回以上の繰り返しを表す正規表現
$行末を表す正規表現

参考までにcsv2json()を書いてみました。
アルゴリズムはほとんど変えていません。
行ごとに処理するときに、「カンマとスペースのみの行」では処理をせずに次のループにスキップしています。

function csv2json(csvArray) { var jsonArray = []; // 最初の行を「見出し」として変数に保存 var keys = csvArray[0].split(',') var keyLength = keys.length // 2行目から「データ」として反復処理 for (var lineIndex = 1; lineIndex < csvArray.length; lineIndex++) { // 行を取得 var currentLine = csvArray[lineIndex] // 行が「カンマとスペースのみ」であれば次の行へ if (/^[,\s]*$/.test(currentLine)) { continue; } // 行をカンマ区切りで分けて各データを取得 var items = currentLine.split(','); // 各要素を処理 for (var itemIndex = 0; itemIndex < keyLength; itemIndex++) { var linObj = {} linObj[keys[itemIndex]] = items[itemIndex]; jsonArray.push(linObj); } } return jsonArray; }

投稿2019/01/13 09:52

編集2019/01/13 09:56
NozomuIkuta

総合スコア1260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

読み込み時に何とかするのも一つだと思いますが、それだとその関数はcsv2jsonではなく、csv2jsonSkippingEmptyRowみたいなものになります。

arrayになったあとに、filterするとか

javascript

1array.filter(e => e.some(c => c !== ""));

objを作るときに、空行をスキップするとか

javascript

1 for (var i = 0; i < jsonArray.length; i++) { 2/*ここ*/ if(jsonArray[i].all(e=> e === "")) {continue;} 3 obj[i] = {

いった方法もご検討ください。

投稿2019/01/15 01:32

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問