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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

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

Q&A

解決済

2回答

4974閲覧

【JavaScript】複雑なCSVファイルのデータをselectboxの値に設定したい

ayaayape

総合スコア12

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

JavaScript

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

0グッド

0クリップ

投稿2019/03/02 14:09

編集2019/03/04 09:23

前提・実現したいこと
以下のような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

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

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

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

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

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

kei344

2019/03/03 08:53

「myform」という名前の付いた要素が無いようですが、どこかにあるのでしょうか。
ayaayape

2019/03/03 12:47

ご質問ありがとうございます。 はい、contentタグのなかに、以下のように設定しています。 <form name="myform"> <input name="myfile" type="file" /> </form>
kei344

2019/03/03 13:04

定義されていない関数もありますし、まず最低限 動きそうなところまで質問文に追記してください。
guest

回答2

0

ベストアンサー

最初プログラムの提示がなかったので丸投げかと思いました。
そういう人のためにコピペしやすいように短くして作ったのですが、
ご提示のものとは似ても似つかないようなコードになってしまいました。
せっかくなので投稿します。
短くするためにchangeイベントが1つ余計についていますが、ご愛敬。
Map の紐づけが味噌、ほんとは1行で書きたかった。 残念。

javascript<!DOCTYPE

1<html lang="ja"> 2<meta charset="utf-8"> 3<title></title> 4<body> 5<p> 6<select name="y"></select> 7<select name="m"></select> 8<select name="d"></select> 9</p> 10 11<script> 12 13const data = ` 14|2019年|1月|1日| 15|2019年|1月|2日| 16|2019年|1月|3日| 17|2019年|1月|4日| 18|2019年|1月|5日| 19|2019年|1月|6日| 20|2019年|1月|7日| 21 22|2018年|2月|1日| 23|2018年|2月|2日| 24|2018年|2月|3日| 25|2018年|2月|4日| 26`, 27Z = []; 28for(let r,s=/(\d+年)\|(\d+月)\|(\d+日)/gm;r=s.exec(data);)Z.push(r.splice(1,3)); 29 30const 31 A = (a,b,c,d,e)=>(e=b.reduce((a,b)=>a.get(b),a),e.has(c)||e.set(c,d)), 32 B = (a,b)=>(a.innerText='',b.forEach(b=>a.appendChild(new Option(b,b)))), 33 C = Z.map(a=>a.map(a=>''+a)).reduce((a,[b,c,d])=>(A(a,[],b,new Map),A(a,[b],c,new Map),A(a,[b,c],d,new Map),a),new Map), 34 D = [...document.querySelectorAll('select')], 35 E = D.reduce((a,b,c,d)=>(a.set(b,d[c+1]),a),new Map), 36 F = a=>{for(let n;n=E.get(a);a=n)B(n,[...D.slice(0,D.indexOf(a)).reduce((a,b)=>a.get(b.value),C).get(a.value).keys()])}; 37 38D.forEach (a=>a.addEventListener('change',e=>F(e.target),!1)),B(D[0],[...C.keys()]),F(D[0]); 39 40</script> 41 42

投稿2019/03/03 05:04

編集2019/03/03 05:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kei344

2019/03/03 05:46

ここまでくると魔法のようですね、素敵です。 HTML部分の終了タグが</select>になっていませんので修正されてはいかがでしょう。
退会済みユーザー

退会済みユーザー

2019/03/03 05:49

やべ!呪文唱えるので必死で・・・ 修正しました。ご指摘ありがとう。
ayaayape

2019/03/03 08:43

回答いただきありがとうございます。 丸投げのような質問してしまい、申し訳ありませんでした。 こうやって設定する方法があるのですね、勉強になります。ありがとうございます 参考にさせていただきます。
guest

0

とりあえずdata = csv2Array(reader.result);のすぐ後でdata からセレクトタグを作るコードを書く必要があります。(下記部分のコードの段階ではdataに値が入っていない可能性が高い)

js

1 for(i=13 ; i<250 ; i++){ 2 if(i%8==3){ 3 yearList.push(data[0][i]); 4 monthList.push(data[1][i]); 5 dayList.push(data[2][i]); 6 } 7 } 8 9 function(data){ // ここ、何故 無名関数?この書き方しても実行されないですよ。 10 yearList=data.yearList; 11 for(var i in yearList){ 12 $("#selectbox1").append("<option value=" + yearList[i].yearNumber + ">" + yearList[i].yearName + "</option>"); 13 14 } 15 }); // ここでエラーが出ない?

reader.resultを hai_haiさんの回答コードに代入すれば機能を実現することは出来ると思います。

投稿2019/03/04 15:04

kei344

総合スコア69407

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

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

ayaayape

2019/03/06 22:39

コメント遅くなり申し訳ありません。 ご回答ありがとうございました。 至らない点が多くご迷惑おかけし申し訳ありませんでした。 なんとかできそうです。本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問