前提・実現したいこと
以下のようなCSVファイルのデータを、selextboxの値に設定したいです。
csvファイル
ーーーーーーーーーーーーーーーーーーー
|年|月|日|
|2019年|1月|1日|
|2019年|1月|2日|
|2019年|1月|3日|
|2019年|1月|4日|
|2019年|1月|5日|
|2019年|1月|6日|
|2019年|1月|7日|
空白行
|2018年|2月|1日|
|2018年|2月|2日|
|2018年|2月|3日|
|2018年|2月|4日|
ーーーーーーーーーーーーーーーーーーー
selectbox1に2019年,2018年
selectbox2に1月,2月
selectbox3に1日,2日…,7日
と表示され、かつ、selectbox同士データを紐づけたいと考えています。
(2019年を選択すると、1月7日まで表示される)
現段階で、CSVファイルの読み取りたい値の取得ができていません。
上記のCSVファイルで、
①,1列目(年)は、2019年を取得し、空白行があった次の行の2018年を取得する。
②,2列目(月)は、1月を取得し、空白行があった次の行の2月を取得する。
③,3列目(日)は、空白行があるまで、値を取得する。(1日から7日まで)
としたいのですが、①~③の記述の仕方が分からず、進められていない状況です。
以下のコードは、調べて似たような記述をまねてやってみたものです。
これでは値の取得はできなかったのですが、どこを改善していけばいいのでしょうか。
何かご教示いただけますと幸いです。
よろしくお願いいたします。
JavaScript
1<div class="content"> 2 3 <form name="myform"> 4 <input name="myfile" type="file" /> 5 <!-- <textarea name="output" cols="100" rows="0" ></textarea>--> 6 </form> 7 8 <script> 9 //Form要素を取得する 10 var form = document.forms.myform; 11 //FileReaderのインスタンスを作成する 12 var reader = new FileReader(); 13 var data; 14 15 //ファイルが読み込まれた時の処理 16 form.myfile.addEventListener('change', function(e) { 17 18 //ここにファイル取得処理を書く 19 var result = e.target.files[0]; 20 21 //読み込んだファイルの中身を取得する 22 reader.readAsText( result ); 23 24 //ファイルの中身を取得後に処理を行う 25 reader.addEventListener( 'load', function() { 26 27 //CSVを1行ずつ読み込む 28 console.log( reader.result.split('\n') ); 29 30 // 2) CSVデータ変換の呼び出し 31 data = csv2Array(reader.result); 32 }) 33 34 }) 35 36 </script> 37 </div> 38 39 <select name="year" id="selectbox1" class="input"> 40 <option value="">選択してください</option> 41 42 </select> 43 <select name="month" id="selectbox2" class="input"> 44 <option value="">選択してください</option> 45 </select> 46 <select name="day" id="selectbox3" class="input"> 47 <option value="">選択してください</option> 48 </select> 49 50 <div class="content"> 51 52 <script type="text/javascript"> 53 54 $(function(){ 55 var yearList=[],monthList=[],dayList=[]; 56 57 for(i=13 ; i<250 ; i++){ 58 if(i%8==3){ 59 yearList.push(data[0][i]); 60 monthList.push(data[1][i]); 61 dayList.push(data[2][i]); 62 } 63 } 64 65 function(data){ 66 yearList=data.yearList; 67 for(var i in yearList){ 68 $("#selectbox1").append("<option value=" + yearList[i].yearNumber + ">" + yearList[i].yearName + "</option>"); 69 70 } 71 }); 72 73 $("#selectbox1").on('change',function(){ 74 var v=$(this).val(); 75 var year=yearList.filter(function(x){ 76 return x.yearNumber==v; 77 }); 78 79 $("#selectbox2 option:gt(0),#selectbox3 option:gt(0)").remove(); 80 if(year.length>0){ 81 82 monthList=area[0].monthList; 83 84 for(var i in monthList){ 85 $("#selectbox2").append("<option value=" + monthList[i].monthNumber + ">" + monthList[i].monthName + "</option>"); 86 } 87 } 88 }); 89 90 $("#selectbox2").on('change',function(){ 91 92 var v=$(this).val(); 93 94 var month=monthList.filter(function(x){ 95 return x.monthNumber==v; 96 }); 97 98 $("#selectbox3 option:gt(0)").remove(); 99 100 if(month.length>0){ 101 102 dayList=class[0].dayList; 103 104 for(var i in dayList){ 105 $("#selectbox3").append("<option value=" + dayList[i].name + ">" + dayList[i].name+ "</option>"); 106 } 107 } 108 }); 109 }); 110 111 </script> 112 <script type="text/javascript"> 113 114 // CSVファイルを2次元配列に変換 115 function csv2Array(str) { 116 var csvData = []; //最終的な二次元配列を入れるための配列 117 var lines = str.split("\n"); //改行を区切り文字として1行ずつ読み取った配列を生成 118 119 //各行ごとにタグで区切った文字列を要素とした二次元配列を生成 120 for (var i = 0; i < lines.length; ++i) { 121 122 var cells = lines[i].split("\t"); //タグで区切って分割する 123 csvData.push(cells); 124 125 //秒に変換する値を取得 126 for(var i=11;i<cells.length;i++){ 127 128 if((i%8==3)){ 129 if((cells[i] !="")){ 130 console.log(cells[i+1]); //チェック 131 var seconds = FormatToSeconds(cells[i+1]);//実施時間 132 console.log(seconds); //チェック 133 cells[i+1] = seconds; //配列に戻す 134 } 135 }; 136 }; 137 } 138 return csvData; 139 } 140 141 //〇分〇秒⇒△秒に変換する関数(△の値のみ取得) 142 function FormatToSeconds(minSec){ 143 return parseInt(minSec.replace(/(\d+)分(\d+)秒/, (_, minitues, seconds) => minitues * 60 + seconds *1)); 144 var seconds = FormatToSeconds(""); 145 } 146 147 //〇時間〇分〇秒⇒△秒に変換する関数(△の値のみ取得) 148 function FormatToSeconds(houSec){ 149 return parseInt(houSec.replace(/(\d+)時間(\d+)分(\d+)秒/, (_,hours, minitues, seconds) => hours * 3600 + minitues * 60 + seconds *1)); 150 var seconds = FormatToSeconds(""); 151 } 152
回答2件
あなたの回答
tips
プレビュー