Macro/投稿/157 のバックアップ差分(No.14)




  • 追加された行はこの色です。
  • 削除された行はこの色です。
* カンマorタブ区切りデータをSQLPLUS風に貼り付け [#f7edf7ac]
-ページ: [[Macro/投稿]]
-作者: [[ガンジャム]]
-カテゴリー: js
-投稿日: 2006-12-15 (金) 23:39:58

** メッセージ [#mfa2644b]
データ量が多いと処理遅いです。
#code(javascript){{
//sepDataPaste.js
//カンマorタブ区切りのクリップボードデータをsqlplus風に整形して挿入します。
//1行目をヘッダ行として2行目にセパレート行を追加(2行目が"",""だったら置換)
//セル結合は無視。セル内改行は半角ブランクに置換。
//区切り文字は行毎に判定
/*
,|\t区切りのクリップボードデータをsqlplus結果風に整形して挿入するマクロ(サクラエディタ用)
----------|------------------------------------------------------------------------------
ファイル名|sepDataPaste.js                                                               
作成者    |ガンジャム                                                                    
更新日    |20070525                                                                      
動作      |                                                                              
          |1行目をヘッダ行とし、次行にセパレータ行を挿入(2行目が"",""だった場合は置換)
          |Excelのセル内改行(LF)は半角ブランクに置換。                                   
          |区切り文字の判定は行毎に行う                                                  
          |Excelのセル結合は無視。                                                       
          |データ量に対し飛躍的に処理が重くなる                                          
*/

var arrMaxWidth = new Array(), arrHeadLine = new Array(), arrDataLines = new Array();
//global変数
var arrMaxWidth = new Array(), arrHeadLine = new Array(); arrDataLines = new Array();
var lineCount = 1;

//エントリ
main();
function main() {
	var arrSplitLine = getClipbrd();
	if (arrSplitLine) {
		if (sepData(arrSplitLine)) {
		if(seprateData(arrSplitLine)) {
			var insTex = setEachLines();
			Editor.InsText(insTex);
		}
	}
}

//クリップボードデータ取得
function getClipbrd() {
	var ie = new ActiveXObject("InternetExplorer.Application");
		ie.Navigate("about:blank");
	var clip = ie.Document.parentWindow.clipboardData.getData("Text");
	var clp = ie.Document.parentWindow.clipboardData.getData("Text");
		ie = null;

	if (clip) {
		return(clip.split("\r\n"));
	if (clp) {
		return(clp.split("\r\n"));
	} else {
		return(false);
	}
}

function sepData(arr) {
//セル内改行(LF)削除、各行処理呼び出し
function seprateData(arr) {
	var re = /\n/g;
	for (i in arr) {
		var strLine = arr[i];
		if (strLine) {
			strLine = strLine.replace(re, " ");
			strLine = strLine.replace(re, "");
			if(!splitData(strLine)) {
				return(false);
			}
		}
		lineCount++;
	}
	return(true);
}

function setSepVal(str) {
//区切り文字判定
function getSeparateVal(str) {
	var reTab = /\t/;
	var reCom = /,/;
	var dupFlg = false;
	var colsep = "";
	var colSep = "";

	if (reTab.test(str)) {
		colsep = reTab;
	if(reTab.test(str)) {
		colsep = /\t/;
		dupFlg = true;
	}
	if (reCom.test(str)) {
		colsep = reCom;
	if(reCom.test(str)) {
		colsep = /,/;
		if (dupFlg) {
			dupFlg = false;
		} else {
			dupFlg = true;
		}
	}
	if(!dupFlg) {
		var objSL = new AtiveXObject("WScript.Shell");
			objSL.popup("区切り文字が判定できませんでした。(sepDataPaste.js)");
		var objSL = new ActiveXObject("WScript.Shell");
			objSL.popup("区切り文字が判定できません。 setSeparateVal()");
			objSL = null;
			return(false);
	} else {
		return(colsep);
	}
}

//区切り文字列を配列に格納し、文字列長比較の呼び出し
function splitData(str) {
	var sep2ndLine = '"",""';
	switch (lineCount) {
	switch(lineCount) {
		case 1:
				var sep = setSepVal(str);
				if (!sep) {
				var sep = getSeparateVal(str);
				if(!sep) {
					return(false);
				} else {
					arrHeadLine = str.split(sep);
					compareLength(arrHeadLine, 0);
				}
				break;
		case 2:
				if (str == sep2ndLine) {
				if(str == sep2ndLine) {
					break;
				}
		default:
				var sep = setSepVal(str);
				if (!sep) {
				var sep = getSeparateVal(str);
				if(!sep) {
					return(false);
				} else {
					var dataLine = str.split(setSepVal(str));
						compareLength(dataLine, 1);
						arrDataLines[lineCount] = dataLine;
					var dataLine = str.split(getSeparateVal(str));
					compareLength(dataLine, 1);
					arrDataLines[lineCount] = dataLine;
				}
	}
	return(true);
}

//文字列長比較し各列の最大幅を格納
function compareLength(arr, f) {
	if (f == 0) {
		for (var i=0 in arr) {
			arrMaxWidth[i] = byteLength(arr[i]);
		}
	} else {
		var ln = new Array();
		var ln  = new Array();
		for (var i=0 in arr) {
			ln[i] = byteLength(arr[i]);
			if (arrMaxWidth[i] < ln[i]) {
				arrMaxWidth[i] = ln[i];
			}
		}
	}
}

//各行をパイプで結合し行末に改行を追加
function setEachLines() {
	var hline = "", dlines = "", sline = "";
	var hline ="", dlines ="", sline ="";

	hline = attachWidth(arrHeadLine).join("|") +"\r\n";
	for (i in arrDataLines) {
		dlines += attachWidth(arrDataLines[i]).join("|") +"\r\n";
		dlines += attachWidth(arrDataLines[i]).join("|") + "\r\n";
	}
	sline += setSeprateLine(arrMaxWidth).join("|") +"\r\n";

	sline += setSeprateLine(arrMaxWidth).join("|") + "\r\n";
	
	return(hline + sline + dlines);
}

//各値の末尾に半角ブランクを追加し各列の最大幅に揃える
function attachWidth(arrColumn) {
	for (var i=0 in arrMaxWidth) {
		var colWth = byteLength(arrColumn[i]);
		if (colWth < arrMaxWidth[i]) {
			var strBlank = "";
			for (j=0; j < (arrMaxWidth[i] - colWth); j++) {
			for (j=0; j<(arrMaxWidth[i] - colWth); j++) {
				strBlank += " ";
			}
			arrColumn[i] += strBlank;
		}
	}
	return(arrColumn);
}

//2行目セパレータ行を生成
function setSeprateLine(arrColumn) {
	var arrDash = new Array();
	for (i in arrColumn) {
		var strDash = "";
		for (j=0; j < arrMaxWidth[i]; j++) {
		for (j=0; j<arrMaxWidth[i]; j++) {
			strDash += "-";
		}
		arrDash[i] = strDash;
	}
	return(arrDash);
}

function byteLength(s) {
	var len = s.length;
	var blen = len;
	for (i=0; i<len; i++) {
		if (isWide(s.charCodeAt(i))) {
			blen++;
//バイト長取得
function byteLength(str) {
	if(str) {
		var len = str.length;
		var blen = len;
		for(i=0; i<len; i++) {
			if(isWide(str.charCodeAt(i))) {
				blen++;
			}
		}
	}
	function isWide(charCode) {
		return(0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode));
		return(0x80 <= charCode &&(charCode <= 0xff60 || 0xffa0 <= charCode));
	}
	return(blen);
}

}}

----
- VBScriptをこんな力業で読ませなくても,拡張子.wsfなら複数言語の混在が出来たような -- [[げんた]] &new{2006-12-26 (火) 00:57:19};
- wsfファイルで作ってみましたがサクラだとエラーになりました。wsf対応してるのかな? -- [[ガンジャム]] &new{2006-12-26 (火) 15:43:04};
- peakさんのマクロ[[../158]]にある2バイト文字判定関数を利用するとか. -- [[maru]] &new{2006-12-27 (水) 02:32:40};
- peakさんので更新しました -- [[ガンジャム]] &new{2006-12-30 (土) 15:16:18};
- csvでもtsvでも -- [[ガンジャム]] &new{2007-06-26 (火) 22:15:56};

#comment



    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS