|
* カンマorタブ区切りデータをSQLPLUS風に貼り付け [#f7edf7ac] -ページ: [[Macro/投稿]] -作者: [[ガンジャム]] -カテゴリー: js -投稿日: 2006-12-15 (金) 23:39:58 ** メッセージ [#mfa2644b] データ量が多いと処理遅いです。 #code(javascript){{ //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) { 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 sepData(arr) { var re = /\n/g; for (i in arr) { var strLine = arr[i]; if (strLine) { strLine = strLine.replace(re, " "); if(!splitData(strLine)) { return(false); } } lineCount++; } return(true); } 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 { 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); } }} ---- - 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 |