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

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

2435閲覧

jqueryを使用したCSV検索機能の実装したい

happy_girl

総合スコア7

CSV

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

jQueryプラグイン

jQueryの拡張機能。 様々な種類があり、その数は膨大です。公開済みのプラグインの他にも、自作することもできます。 jQueryで利用できるようにしておくだけで、導入およびカスタマイズが比較的容易に行なえます。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2022/02/22 00:07

編集2022/02/22 05:32

0

1

phpが使えない環境にて、jqueryを使用した検索機能を実装中につまづいています。

初心者なりになんとか実装したものの、100件程度のcsvなら問題ないのですが、2000件程度のcsvだと処理にかなり時間がかかってしまい、タイムアウトしてしまいます。
何かいい解決方法はありますでしょうか?
csvの読み込みにはjqueryのプラグインjquery.csv.jsを使用しています。
ご教示いただけますと幸いです。

試したこと

いったんcsvの中身を出力して、クラスのkクラスの付け外しで表示を切り替えているところ等、
処理の効率が悪いことが原因なのは分かるのですが、、、解決策がわからず、八方塞がりの状態です、、、

目指したい挙動

<セレクトボックス>
都道府県:選択してください
市区町村:選択してください

<セレクトボックス>
都道府県:北海道

を選択した場合

csv、1列目に北海道と記載のある市区町村を

<セレクトボックス>
市区町村:選択してください

のセレクトボックスに表示

<セレクトボックス>
都道府県:北海道
市区町村:札幌市中央区

を選択した場合

下記のcsvの情報が出力される
北海道 ,札幌市中央区,○,○,ダミーテキスト,○,○,○,○,○,○,○,○,○

codepen(csvはリンクされていません)

https://codepen.io/fumiya-nakamura/pen/xxPjrmy

css

css

1 /* 表示切り替え用css */ 2 .shityouson option, 3 .ichiran li { 4 display: none; 5 } 6 7 .shityouson option.is-visible, 8 .ichiran li.is-visible { 9 display: block; 10 }

現状の仕組み

①読み込み事にリストを読み込みんでcssで非表示。
セレクトボックスの値によって非表示の状態のリスト

html

html

1 <form action="" id="result"> 2 県:<select name="example1" class="ken"> 3 </select><br><br> 4 市区町村:<select name="example2" class="shityouson"> 5 </select> 6 <br><br> 7 <ul class="ichiran"></ul> 8 </form>

jquery

javascript

1//csvを読み込み 2$(function () { 3 $.get('../../../data.csv', function (data) { 4 var csv = $.csv()(data); 5 $(csv).each(function () { 6 if (this[0] && this[1] && this[2] && this[3] && this[4]) { 7 $("#csv").append("<tr><td>" + this[0] + "</td><td>" + this[1] + "</td><td>" + this[2] + "</td><td>" + this[3] + "</td></tr>"); 8 $(".ken").append('<option class="post" data-ken_name=' + this[0] + '>' + this[0] + "</option>"); 9 $(".shityouson").append('<option class="post" data-shityouson="' + this[0] + '">' + this[1] + "</option>"); 10 11 $(".ichiran").append('<li data-shityouson="' + 12 this[1] + '"><h2>ダミーテキスト</h2><table><tr><th>ダミーテキスト</th><td>' + 13 this[2] + '</td></tr><tr><th>ダミーテキスト</th><td>' + 14 this[3] + '</td></tr></table><br><h2>ダミーテキスト</h2><table><tr><th>ダミーテキスト</th><td>' + 15 this[5] + '</td></tr><tr><th>ダミーテキスト</th><td>' + 16 this[6] + '</td></tr></table><br><h2>ダミーテキスト</h2><table><tr><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th><th>日</th></tr><tr><td>' + 17 this[7] + '</td><td>' + 18 this[8] + '</td><td>' + 19 this[9] + '</td><td>' + 20 this[10] + '</td><td>' + 21 this[11] + '</td><td>' + 22 this[12] + '</td><td>' + 23 this[13] + '</td></tr></table><br><h2>ダミーテキスト</h2><p>' + 24 this[4] + '</p><br><h2>ダミーテキスト</h2><p>' + 25 this[4] + '</p></li>'); 26 } 27 }) 28 }) 29}); 30 31window.addEventListener('load', function () { 32 //同じ都道府県を削除 33 $('.post').filter( 34 function () { 35 const t = $(this).text(); 36 return this !== $(`.post:contains('${t}')`).get(0); 37 } 38 ).remove(); 39 40 //都道府県によって市町村を表示 41 $('.ken').change(function () { 42 var ken_name = $(this).val(); 43 $('.shityouson option').each(function (index) { 44 const userId = ken_name; 45 const data = document.querySelectorAll('[data-shityouson="' + userId + '"]'); 46 $(this).removeClass('is-visible'); 47 $('[data-shityouson="' + userId + '"]').addClass('is-visible'); 48 }); 49 }); 50 51 //該当する市町村の情報を表示 52 $('.shityouson').change(function () { 53 const result = $('.shityouson').val(); 54 $(".ichiran li").each(function (index) { 55 $(this).removeClass('is-visible'); 56 var li_result = $(this).attr('data-shityouson'); 57 if (li_result === result) { 58 $(this).addClass('is-visible'); 59 } 60 }); 61 }); 62});

csv

csv

1北海道 ,札幌市中央区,,,ダミーテキスト,,,,,,,,, 2北海道 ,札幌市北区,,,ダミーテキスト,,,,,,,,, 3 4沖縄県 ,八重山郡与那国町,,,ダミーテキスト,,,,,,,,,

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/02/22 00:15

何の処理に時間がかかっているか、細かく区切って測定できると良いですが。each()で回すと1行ずつの処理になるので、例えば1行ごとに出力せず10行まとめてから出力するとか、やり方を変えてみると見えてくるかもしれません。
happy_girl

2022/02/22 00:24

ご返答ありがとうございます。 おっしゃる通り、切り分けをしたところ、 $(".ichiran li").each(function (index) { の箇所が重い処理になっていそうです、、、 今回の仕様ですと該当のcsvデータを表示する機能の実装になるのですが、10行まとめてから出力というのがどういった処理で当てはまるのか想像が追いついておりません。。。
yambejp

2022/02/22 00:42

何をどうしたときにどういう結果がほしいのか説明したほうが良いと思います
happy_girl

2022/02/22 02:19 編集

言葉足らずで申し訳ありません。 都道府県と市町村を選択した際に、該当の情報をcsvから引っ張ってきて表示させたいです。 (1列目に都道府県、2列目に市区町村、3列目以降に該当地区の情報) <セレクトボックス> 都道府県:選択してください 市区町村:選択してください ↓ <セレクトボックス> 都道府県:北海道 を選択した場合 ↓ csv、1列目に北海道と記載のある市区町村を <セレクトボックス> 市区町村:選択してください のセレクトボックスに表示 ↓ <セレクトボックス> 都道府県:北海道 市区町村:札幌市中央区 を選択した場合 ↓ 下記のcsvの情報が出力される 北海道 ,札幌市中央区,○,○,ダミーテキスト,○,○,○,○,○,○,○,○,○
guest

回答1

0

ベストアンサー

とりあえずcsvのメソッドは$.csv.toArrays()

sample

csvの取り込み部分だけjQueryを利用しておきます

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-csv/1.0.3/jquery.csv.min.js"></script> 3<script> 4window.addEventListener('DOMContentLoaded', async()=>{ 5 const url='sample.csv'; 6 const data=await fetch(url).then(res=>res.text()); 7 var csv=$.csv.toArrays(data); 8 [...new Set(csv.map(x=>x[0]))].forEach(x=>{ 9 ken.appendChild(Object.assign(document.createElement('option'),{value:x,textContent:x})); 10 }); 11 ken.addEventListener('change',e=>{ 12 const v=e.target.value; 13 document.querySelectorAll('#shityouson option').forEach((x,y)=>{ 14 if(y>0) x.remove(); 15 }); 16 csv.filter(x=>x[0]==v).map(x=>x[1]).forEach((x,y)=>{ 17 shityouson.appendChild(Object.assign(document.createElement('option'),{value:x,textContent:x,"data-idx":y})); 18 }); 19 ichiran.textContent=""; 20 }); 21 shityouson.addEventListener('change',e=>{ 22 const v=csv.filter(x=>x[0]==ken.value && x[1]==shityouson.value); 23 ichiran.textContent=v; 24 }); 25 26}); 27// var ken=[...new Set(data.map(x=>x[0]))]; 28</script> 29 30<select id="ken"> 31<option value="">---</option> 32</select> 33<select id="shityouson"> 34<option value="">---</option> 35</select> 36<div id="ichiran"></div>

投稿2022/02/22 00:55

編集2022/02/22 06:36
yambejp

総合スコア118035

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

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

happy_girl

2022/02/22 04:12

ありがとうございます! 説明不足で、すいません。 目指したい挙動を追記したので、ご確認いただけますと幸いです!
yambejp

2022/02/22 06:39

csvはケアする処理が多いのでデータという意味ではjsonの方が取り扱いしやすいと思います
happy_girl

2022/02/22 11:55

ありがとうございます!!! そうなのですね、json、勉強いたします、、!! 1点確認なのですが、 出力がカンマ区切りを現状の仕組みのように jQueryの $(".ichiran").append('<li data-shityouson="' + this[1] + '"><h2>ダミーテキスト</h2><table><tr><th>ダミーテキスト</th><td>' + this[2] + '</td></tr><tr><th>ダミーテキスト</th><td>' + this[3] + '</td></tr></table><br><h2>ダミーテキスト</h2><table><tr><th>ダミーテキスト</th><td>' + this[5] + '</td></tr><tr><th>ダミーテキスト</th><td>' + this[6] + '</td></tr></table><br><h2>ダミーテキスト</h2><table><tr><th>月</th><th>火</th><th>水</th><th>木</th><th>金</th><th>土</th><th>日</th></tr><tr><td>' + this[7] + '</td><td>' + this[8] + '</td><td>' + this[9] + '</td><td>' + this[10] + '</td><td>' + this[11] + '</td><td>' + this[12] + '</td><td>' + this[13] + '</td></tr></table><br><h2>ダミーテキスト</h2><p>' + this[4] + '</p><br><h2>ダミーテキスト</h2><p>' + this[4] + '</p></li>'); のようにそれぞれ格納はまた別の処理が必要なのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問