- 追加された行はこの色です。
- 削除された行はこの色です。
* カンマ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