SHOJI's Code
 仕事や趣味で書いた各種言語のプログラミングコード(エクセルVBA,PHP,C/C++/C#,JavaScript等)、その他雑記。
2017.08<<123456789101112131415161718192021222324252627282930>>2017.10
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

仕事でJavaScriptを使ってHTAなどプログラミングしていくうちに、よく使うものはクラス化しておこうと思い、まず作ったのがこれ。CSVファイルを扱うためのクラス。特に説明などもしないし、あまりテストもしてないので、誤りもあるかもしれないが、載せておくことにする。
// コンストラクタ
function Csv()
{
this.initialize.apply(this, arguments);
}

// プロトタイプ
Csv.prototype = {
initialize: function(csvfile)
{
var __this = this;

__this.items = new Array(); // itemsプロパティ - データ項目
__this.filename = null; // filenameプロパティ - ファイル名

if( csvfile ) __this.read( csvfile ); // ファイル名が指定されていたら読み込む
},

// clearメソッド - データのクリア
clear: function()
{
var _this = this; // インスタンスを退避

try { delete _this.items; } catch(e) {}
_this.items = new Array();
_this.filename = null;
},

// getItemメソッド - 項目の取得
getItem: function(row,col)
{
var _this = this; // インスタンスを退避

if( col<0 || row<0 ) return null; // 列や行がマイナスならnullで戻る
if( !_this.items[row] ) return null; // 行が範囲を超えていたらnullで戻る

return _this.items[row][col];
},

// setItemメソッド - 項目の設定
setItem: function(row,col,value)
{
var _this = this; // インスタンスを退避

if( col<0 || row<0 ) return false; // 列や行がマイナスならfalseで戻る

if( !_this.items[row] ) // 指定行がないなら作成する
_this.items[row] = new Array();

_this.items[row][col] = value;
return true;
},

// deleteRowメソッド - 行の削除
deleteRow: function(row,num)
{
var _this = this; // インスタンスを退避

if( row<0 ) return false; // 行がマイナスならfalseで戻る
if( row>=_this.items.length ) return false; // 行が範囲を超えていたらfalseで戻る

if( num==null ) num = 1;

_this.items.splice(row,num);
return true;
},

// insertRowメソッド - 行の挿入
insertRow: function(row,num)
{
var _this = this; // インスタンスを退避

if( row<0 ) return false; // 行がマイナスならfalseで戻る
if( row>=_this.items.length ) return false; // 行が範囲を超えていたらfalseで戻る

if( num==null ) num = 1;

for(var i=0;i<num;i++)
_this.items.splice(row,0,new Array());
return true;
},

// deleteColumnメソッド - 列の削除
deleteColumn: function(col,num)
{
var _this = this; // インスタンスを退避

if( col<0 ) return false; // 列がマイナスならfalseで戻る

if( num==null ) num = 1;

for(var row in _this.items)
{
if( col>=_this.items[row].length ) continue; // 列が範囲を超えていたら無視
_this.items[row].splice(col,num);
}
return true;
},

// insertColumnメソッド - 列の挿入
insertColumn: function(col,num)
{
var _this = this; // インスタンスを退避

if( col<0 ) return false; // 列がマイナスならfalseで戻る

if( num==null ) num = 1;

for(var row in _this.items)
{
if( col>=_this.items[row].length ) continue; // 列が範囲を超えていたら無視
for(var i=0;i<num;i++)
_this.items[row].splice(col,0,"");
}
return true;
},


// splitメソッド - 行文字列を項目別に分割(内部使用)
split: function(line)
{
var tmp = line.split(","); // 仮にクォーテーションは考えずカンマ区切りで分ける
var csv = new Array(); // 実際のCSV項目

while( tmp.length > 0 ) // 仮の項目がすべてなくなるまで
{
var s = tmp.shift(); // 最初の項目を抜き出す

if( s.charAt(0) == '"' ) // 先頭がクォーテーションならば
{ // 最後がクォーテーションとなるまで文字列を連結
while( tmp.length>0 && s.charAt( s.length - 1 ) != '"' )
s += "," + tmp.shift();

s = s.replace(/^"/,""); // クォーテーションを除去
s = s.replace(/"$/,"");
s = s.replace(/""/,'"');// クォーテーション文字の確定
}
csv.push(s); // CSV項目の確定
}
return csv;
},

// lineメソッド - 1行分の項目を文字列データに変換(内部使用)
line: function(csv)
{
var line = ""; // 行データ

try
{
for(var i=0;i<csv.length;i++) // すべての項目について
{
var s = "" + (!csv[i] ? "" : csv[i]);

s = s.replace(/"/g,'""');
if( s.indexOf(',')>=0 || s.indexOf('"')>=0 ) s = '"' + s + '"';
if( i>0 ) line += ",";
line += s;
}
}
catch(e) {}

return line;
},

// readメソッド - ファイルからの読みこみ
read: function(filename,code)
{
var _this = this; // インスタンスを退避

if( code == null ) code = 0;

try {
var fso = new ActiveXObject("Scripting.FileSystemObject"); // FileSystemObjectを作成
var csv = fso.OpenTextFile(filename,1,false,code); // ファイルを開く

_this.clear(); // 項目をクリアする
while( !csv.AtEndOfStream ) // ファイルの最後まで
{
var line = csv.ReadLine(); // 1行読みこみ
var columns = _this.split(line); // 項目に分ける
_this.items.push( columns ); // 行データとして追加する
}
_this.filename = filename; // ファイル名を保存
csv = null; delete csv;
fso = null; delete fso;
return true;
}
catch(e)
{
return false;
}
},

// writeメソッド - ファイルへの書き込み
write: function(filename,code)
{
var _this = this; // インスタンスを退避

if( filename == null ) filename = _this.filename;
if( code == null ) code = 0;

if( _this.filename == null ) return false; // ファイル名がnullならfalseで戻る

try {
var fso = new ActiveXObject("Scripting.FileSystemObject"); // FileSystemObjectを作成
var csv = fso.OpenTextFile(filename,2,true,code); // ファイルを開く

for(var i=0;i<_this.items.length;i++)
{
var line = _this.line( _this.items[i] ); // 1行文字列作成
csv.WriteLine(line); // 1行書き込み
}
_this.filename = filename; // ファイル名を更新
csv = null; delete csv;
fso = null; delete fso;
}
catch(e)
{
return false;
}
}
};


テーマ:JavaScript(ジャバスクリプト) - ジャンル:コンピュータ
コメント
この記事へのコメント
コメントを投稿する

管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL
この記事へのトラックバック
copyright © 2004-2006 SHOJI, Powered By FC2ブログ all rights reserved.
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。