初心者がJavascriptでどうしても改行含みのCSV読み込みがしたかった


前置き

まず、自分用のナレッジ的なところもあるので、すごく見づらいと思います。
業務でCSVのインポートをしないといけなくなり、ライブラリとかよくわからずに使うのも嫌だったので、
なんとか自分で作ってみた。
初心者タグ付けてるけど初心者向けではないと思います。。。

読込ファイルの前提条件

・カンマ区切り
・全項目(ヘッダも含む)ダブルクオーテーション括り

上記が満たせれば読み込める(はず)

実装

えらい人だったらもっと綺麗にかけるんだろうなぁ
掲載用にコメント付けてます。見ずらかったらごめんなさい。

main.js
function input_data(evt){
    var file = evt.target.files;
    var reader = new FileReader();
    reader.readAsText(file[0],'shift-jis');
    reader.onload = function(){
        let data = reader.result;
        let str = '';
        let inLine = [];
        let inData = [];
        let inCell = false;

        for(let i=0; i<data.length; i++){
            //文字がダブルクォートかつ次の文字がカンマかNULLのときフラグをfalse
            if(data[i] == '&quot' && (data[i+1] == ',' || data[i+1] == null)){
                inCell = false;
            }
            //文字がダブルクォートかつ次の文字が改行のとき(行の終端)
            //inLineをinDataに格納して初期化
            if(data[i] == '&quot' && /\r\n|\r|\n/.test(data[i+1])){
                inLine.push(str);
                str='';
                inData.push(inLine);
                inLine = [];
                inCell = false;
            }
            //フラグがtureだったらstrに文字を格納
            if(inCell){
                str+=data[i];
            }
            //文字がダブルクォートかつ次の文字が改行ではないとき
            if(data[i] == '&quot' && !(/\r\n|\r|\n/.test(data[i+1]))){
                inCell = true;
            }
            //文字がダブルクォートかつ次の文字がカンマかNULLのときフラグをfalse
            if(data[i] == '&quot' && (data[i+1] == ',' || data[i+1] == null)){
                inCell = false;
            }
            //ざっくりいうと ,"", ⇐こういう空データのとき
            if(!inCell && data[i]==',' && data[i+1]=='&quot' && data[i+2]=='&quot' && data[i+3]==','){
                inLine.push(str);
                str='';
            }
            //フラグがfalseかつ文字列が格納されているとき
            if(!inCell && str){
                inLine.push(str);
                str='';
            }
        }
        $('input[id=file]').val('');
    }
    return inData;
}

地味にはまったのが次の文字が改行かどうかを判別する部分。
matchとかindexOfとかだとエラーになる。
配列の参照とか関数側の評価の仕方に問題があるんだろうけど理由はわからん。えろいひと教えて

あとがき

以下自己満なので読んでも読まなくても大丈夫です。

読み込んだファイルを一文字ずつ評価していて。フラグを使ってデータかそうでないかを出力しているんだけど、
膨大なデータだと確実に積む。あと重複してたりする箇所あるし無駄が多いんじゃないかってめっちゃ思う。

今まは頑張ったな自分ってほめてやりたいけど未来の自分にクソースばら撒くなって怒られそう💩

ここまで読んでいただきありがとうございました。