お世話になります。
csvファイルを文字列としてロード後、二次元配列に格納して利用するプログラムを作成しております。
こちらの
http://tips.recatnap.info/wiki/JQuery%E3%81%A7CS …
jquery.csv.jsというプラグインでCSVファイルを配列に格納してみたのですが、セル内の文字列に改行がある場合は対応していないようで、データが崩れてしまいました。
いろいろ調べたところ、単なるsplitでは上手くいかないということや、ダブルクオートが閉じられていない改行コードはレコードの最後だとはみなさないようにすればいいなど、イメージとしてはわかるのですが、検索してもそのような手本となるようなサンプルやjquery.csv.jsの改造方法などが見つけられませんでした。
自分ではどう記述したらいいのかさっぱりわからず、皆様のお力をお借りしたいと思います。
必要な情報があれば補足いたしますので、
なにとぞよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
字句解析と構文解析を行う必要があります。
この手はコンパイラ技術の範疇なので、面倒に思えるかもしれませんが、
CSV程度に用いるならたいしたことはありません。
以下簡単なサンプルです
// 字句解析
function Tokenizer(src) {
this.src = src;
this.index = 0;
this.length = src.length;
}
Tokenizer.prototype = {
seekC: function(){ return (this.index < this.length)? this.src.charCodeAt(this.index): 0 },
readC: function(){ var i = this.index++; return (i < this.length)? this.src.charCodeAt(i): 0 },
forwC: function(){ this.index++ },
backC: function(){ this.index-- },
readS: function (eoc){
var s = '', x = this.readC();
while (x) {
if (x == eoc) { if (this.seekC() == eoc) this.forwC(); else break; }
s += String.fromCharCode(x);
x = this.readC();
}
return s;
},
TASK: {
0x00: function(c){ return {type:'eof'} },
0x0A: function(c){ return {type:'eol'} },
0x0D: function(c){ if (this.seekC() == 0x0A) this.forwC(); return {type:'eol'} },
0x22: function(c){ return {type:'string', body:this.readS(0x22)} },
0x27: function(c){ return {type:'string', body:this.readS(0x27)} },
0x2C: function(c){ return {type:'separator'} },
},
nextToken: function(){
var c = this.readC(), f = this.TASK[c];
if (f) return f.call(this, c);
var s = String.fromCharCode(c);
for (c = this.seekC(); !this.TASK[c]; c = this.seekC()) s += String.fromCharCode(this.readC());
return {type:'string', body:s};
}
};
// 構文解析
function parseCSV(text) {
var pre, tok, t = new Tokenizer(text), flag = true;
var records = [], record = [], s = '';
while (flag) {
tok = t.nextToken();
switch (tok.type) {
case 'string':
s += tok.body;
break;
case 'separator':
record.push(s), s = '';
break;
case 'eof':
flag = false;
if (pre.type != 'eol') {
record.push(s), s = '';
records.push(record), record = [];
}
break;
case 'eol':
record.push(s), s = '';
records.push(record), record = [];
break;
default:
throw "error!";
}
pre = tok;
}
return records;
}
// 使用例
var data = parseCSV("abc,'def','g h i'\n'jk''lmn''op','qrs\ntu',vwxyz");
わざわざサンプルを書いて頂きましてありがとうございます。
最初書いて頂いた内容を参考に作ろうと思っていましたが、ちょうど良いライブラリを配布なさっている方がいらっしゃいましたので、今回はそちら一部参考にして無事思い通りの動作をさせることができました。
今回はこちらのライブラリを参考にしてできそうなので、こちらを利用させて頂こうと思います。
http://www.kawa.net/works/js/jkl/parsexml.html
ありがとうございました。
No.1
- 回答日時:
「詳しい人」ではありませんので、ご希望とは違ってしまってますが
◆自作するのに、考え方やロジックを求めているのなら…
規格が一応あるようですが後付け的なので、csv作成のアプリケーションによって独自のルールで作成されている場合があるようです。
http://www.kasai.fm/wiki/rfc4180jp
以下のサイトに概略の考え方やコード例(javascriptではありませんが)も示されていますので、ご参考になるかと思います。
http://dobon.net/vb/dotnet/file/readcsvfile.html
すでに調べていらっしゃるかも知れませんが、ご質問内容はそれなりに一般的なものなので、いろいろと取り組んでいる先人達がたくさんいると思われます。
検索すれば、上記以外にも解説しているサイトは数多くあることでしょう。
◆自作するわけではなく、変換できさえすればよいのなら…
同様に、ライブラリ化されているものも多くあるようですので、それを利用するのが簡単かと。
吟味していませんが、とりあえず検索してみたもの。
http://papaparse.com/
http://jquery-csv.googlecode.com/git/examples/ba …
ちゃんと探せば、こちらも数多く見つかると思いますので、ご希望に合うものをご利用なさるのがよろしいでしょう。
ありがとうございます。
今回はできればそのまま使えるライブラリを探していたのですが、日本語でばかり検索していたので見つけられませんでした。今後の参考にさせて頂きます。
今回はこちらのライブラリを参考にしてできそうなので、こちらを利用させて頂こうと思います。
http://www.kawa.net/works/js/jkl/parsexml.html
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) vbaマクロについて 次のようなマクロを組みたいです。 自分は初心者なので全くわかりません。 詳しく 8 2023/05/18 18:38
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Excel(エクセル) csvに別のExcelの文章を差し込む 2 2023/04/01 16:06
- Visual Basic(VBA) vbaマクロについて 【1.csv】をもとに【商品.csv】に有るものを【有り.csv】として名前を 1 2023/05/18 07:58
- Visual Basic(VBA) エクセルVBAについて 8 2022/07/13 22:41
- その他(プログラミング・Web制作) pythonのpandasのcsvの外部結合(outer_join)した際に列が想定とは異なる事象 1 2022/05/25 13:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpでの文字の点滅表示
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
jquery 複数のメソッド
-
XMLHttpRequestでキャッシュを...
-
関数名をテキストから読み込む...
-
TexでΣの添え字の位置直し
-
google apps scriptの終了のさせ方
-
フォーム入力値の重複チェック
-
任意の座標をクリックさせるには
-
同じ型【ハイフンと数字】だけ...
-
問題はbind の付いたリスナーを...
-
「オブジェクトが必要です。」...
-
ジェネレーターの作り方
-
1から20までの整数から、重複な...
-
innerHTML実行後のイベント
-
フォルダ名をフォルダ内のテキ...
-
javascriptでテーブルに追加し...
-
シンプルなweb版スタンプラリー...
-
FireFoxのjavascriptで自動でキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
jslintのエラーについて質問
-
クリックすると上に開くアコー...
-
XMLHttpRequestでキャッシュを...
-
ajax反映後のjqueryが動かない
-
要素名がスペースを含む場合のj...
-
function(e)の意味を教えてくだ...
-
jQueryの :not() .not() が有効...
-
jQueryでzipを解凍読み込みする...
-
関数名をテキストから読み込む...
-
getElementByIdを使用したグロ...
-
jqueryuiのdialog
-
drawImageの描画順序の指定につ...
-
addEventListener()でリスナー...
-
jQuery 同じ処理を関数にまとめ...
-
jqueryのグローバル変数とロー...
-
XMLHttpRequestオブジェクトが...
-
javascript(jQuery)でセル内...
おすすめ情報