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




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

** メッセージ [#mfa2644b]
文字列バイト長取得にpeakさんのbyteLengh()を利用してすっきりしました。
データ量が多いと処理遅いです。
#code(javascript){{
//excelPaste.js
//Excel等で表範囲をコピーした際のタブ区切りクリップボードデータをSQLPLUS風に整形して挿入
//1行目をヘッダ行として2行目にセパレート行を追
//sepDataPaste.js
//カンマorタブ区切りのクリップボードデータをsqlplus風に整形して挿入します。
//1行目をヘッダ行として2行目にセパレート行を追加(2行目が"",""だったら置換)
//セル結合は無視。セル内改行は半角ブランクに置換。
//区切り文字は行毎に判定

var arrMaxWidth = new Array(), arrHeadLine = new Array(), arrDataLines = new Array();
var lineCount = 1;

main();
function main() {
	var arrSplitLine = getClipbrd();
	if (arrSplitLine) {
		seprateTab(arrSplitLine);
		var insTex = setEachLines();
		Editor.InsText(insTex);
		if (sepData(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");
		ie = null;

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

function seprateTab(arr) {
function sepData(arr) {
	var re = /\n/g;
	for (i in arr) {
		var strLine = arr[i];
		if (strLine) {
			strLine = strLine.replace(re, " ");
			splitTab(strLine);
			if(!splitData(strLine)) {
				return(false);
			}
		}
		lineCount++;
	}
	return(true);
}

function splitTab(str) {
	if (lineCount == 1) {
		arrHeadLine = str.split("	");
		compareLength(arrHeadLine, 0);
function setSepVal(str) {
	var reTab = /\t/;
	var reCom = /,/;
	var dupFlg = false;
	var colsep = "";

	if (reTab.test(str)) {
		colsep = reTab;
		dupFlg = true;
	}
	if (reCom.test(str)) {
		colsep = reCom;
		if (dupFlg) {
			dupFlg = false;
		} else {
			dupFlg = true;
		}
	}
	if(!dupFlg) {
		var objSL = new AtiveXObject("WScript.Shell");
			objSL.popup("区切り文字が判定できませんでした。(sepDataPaste.js)");
			objSL = null;
			return(false);
	} else {
		var dataLine = str.split("	");
		compareLength(dataLine, 1);
		arrDataLines[lineCount] = dataLine;
		return(colsep);
	}
}

function splitData(str) {
	var sep2ndLine = '"",""';
	switch (lineCount) {
		case 1:
				var sep = setSepVal(str);
				if (!sep) {
					return(false);
				} else {
					arrHeadLine = str.split(sep);
					compareLength(arrHeadLine, 0);
				}
				break;
		case 2:
				if (str == sep2ndLine) {
					break;
				}
		default:
				var sep = setSepVal(str);
				if (!sep) {
					return(false);
				} else {
					var dataLine = str.split(setSepVal(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();
		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 = "";

	hline = attachWidth(arrHeadLine).join("|") +"\r\n";
	for (i in arrDataLines) {
		dlines += attachWidth(arrDataLines[i]).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++) {
				strBlank += " ";
			}
			arrColumn[i] += strBlank;
		}
	}
	return(arrColumn);
}

function setSeprateLine(arrColumn) {
	var arrDash = new Array();
	for (i in arrColumn) {
		var strDash = "";
		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 isWide(charCode) {
		return(0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode));
	}
	return(blen);
}
function isWide(charCode) {
	return(0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode));
}

}}

----
- 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};

#comment


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