「TSV(CSV) ⇒ 固定長」の版間の差分
ナビゲーションに移動
検索に移動
ページの作成:「=== 概要 === *TSV形式またはCSV形式から固定長へ変換します。 *選択部分を対象とします。 *変換結果はクリップボードにコピー...」 |
SyntaxHighlightにcopyの追加 |
||
| (2人の利用者による、間の12版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | |||
*TSV形式またはCSV形式から固定長へ変換します。 | *TSV形式またはCSV形式から固定長へ変換します。 | ||
*選択部分を対象とします。 | *選択部分を対象とします。 | ||
*変換結果はクリップボードにコピーします。 | *変換結果はクリップボードにコピーします。 | ||
== 変数の説明 == | |||
;auto_decision | ;auto_decision | ||
:trueのとき、形式を自動判別します。 | :trueのとき、形式を自動判別します。 | ||
| 23行目: | 23行目: | ||
:行内の各要素間に区切り文字が必要なときに適宜指定します。 | :行内の各要素間に区切り文字が必要なときに適宜指定します。 | ||
== | == 注意事項 == | ||
* | *自動認識は、以下の優先順位で判断します(いずれにも合致しないときは、処理を中断します)。 | ||
#選択文字列にタブ文字が含まれる場合は、タブ区切りとみなします。 | #選択文字列にタブ文字が含まれる場合は、タブ区切りとみなします。 | ||
#カンマの左右に「"」があるときは、引用符つきカンマ区切りとみなします。 | #カンマの左右に「"」があるときは、引用符つきカンマ区切りとみなします。 | ||
| 30行目: | 30行目: | ||
*auto_decisionとpopup_decisionの両方がfalseのときは、初期値(タブ区切り)で処理します。 | *auto_decisionとpopup_decisionの両方がfalseのときは、初期値(タブ区切り)で処理します。 | ||
== | == 動作環境(作成環境) == | ||
* Mery: Ver 2.1.5.4624 | |||
* OS: Windows 7 SP1 (64bit) | |||
== | == 変更履歴 == | ||
2013 | * 1.0.1 (2013-04-16) | ||
** 空要素を含む場合にズレるのを修正 | |||
* 1.0.0 (2013-01-28) | |||
** 初版 | |||
== ソースコード == | |||
< | <syntaxhighlight lang="javascript" copy> | ||
#title = "固定長に変換" | #title = "固定長に変換" | ||
// tsv2fix.js | // tsv2fix.js | ||
// 2013 | // 2013-04-16 | ||
var auto_decision = true; | var auto_decision = true; // true | false 簡易自動判別を利用するか。 | ||
var popup_decision = | var popup_decision = false; // true | false ポップアップメニューを利用するか。 | ||
var popup_align = false; | var popup_align = false; // true | false ポップアップメニューを利用するか。 | ||
var leftmargin = 1; // 左マージン | var leftmargin = 1; // 左マージン | ||
var rightmargin = 1; // 右マージン | var rightmargin = 1; // 右マージン | ||
var separator = " | var separator = ""; // 要素の区切り文字(出力時) | ||
var deli = | var deli = "\t"; // 区切り文字 | ||
var align = "left"; // left | right | center アラインメントの初期値。 | var align = "left"; // left | right | center アラインメントの初期値。 | ||
var pad = " "; // 埋め込む文字 | var pad = " "; // 埋め込む文字 | ||
| 59行目: | 62行目: | ||
var output = []; | var output = []; | ||
if ( auto_decision ) { | if ( auto_decision ){ | ||
// --- 簡易自動判別。 --- | |||
if ( /\t/.test( str ) ){ // タブ区切り | |||
deli = /\t/ | |||
} else if ( /", *"/.test( str ) ){ // 引用符つきカンマ区切り | |||
str = str.replace( /^"|"$/gm, ""); | |||
deli = "\", *\""; | |||
} else if ( /, */.test( str ) ){ // カンマ区切り | |||
deli = ", *"; | |||
} else { | |||
Quit(); | |||
} | |||
} else if ( popup_decision ) { | } else if ( popup_decision ){ | ||
// --- ポップアップメニューで指定する。 --- | |||
var menu = CreatePopupMenu(); | |||
menu.Add( "タブ区切り", 1, 0 ); | |||
menu.Add( "カンマ区切り", 2, 0 ); | |||
menu.Add( "引用符つきカンマ区切り", 3, 0 ); | |||
menu.Add( "その他", 4, 0 ); | |||
var r = menu.Track( mePosMouse ); | |||
switch( r ){ | |||
case 0: | |||
Quit(); | |||
case 1: | |||
break; | |||
case 2: | |||
deli = /, */ | |||
break; | |||
case 3: | |||
str = str.replace( /^"|"$/gm, ""); | |||
deli = "\", *\""; | |||
break; | |||
case 4: | |||
deli = prompt( "区切り文字(正規表現・スラッシュ不要)?", "" ); | |||
if ( deli == "" ){ Quit() }; | |||
break; | |||
default : | |||
} | |||
} | } | ||
var delie = new RegExp( deli, "i" ); | |||
if ( popup_align ) { | if ( popup_align ){ | ||
// --- ポップアップメニューでアラインメントを指定する。 --- | |||
var menu = CreatePopupMenu(); | |||
menu.Add( "左寄せ", 1, 0 ); | |||
menu.Add( "右寄せ", 2, 0 ); | |||
menu.Add( "センタリング", 3, 0 ); | |||
var r = menu.Track( mePosMouse ); | |||
switch( r ){ | |||
case 0: | |||
Quit(); | |||
case 1: | |||
align = "left"; | |||
break; | |||
case 2: | |||
align = "right"; | |||
break; | |||
case 3: | |||
align = "center"; | |||
break; | |||
default : | |||
} | |||
} | } | ||
var delix = new RegExp( "(" + deli + ")("+ deli + ")", "ig" ); | |||
str = str.replace( delix, "$1 $2" ); | |||
var lines = str.replace( /\s+$/, "" ).split ( "\n" ); | var lines = str.replace( /\s+$/, "" ).split ( "\n" ); | ||
// 各列の最大長を調べる。 | // 各列の最大長を調べる。 | ||
for ( var i = 0; i < lines.length; i++ ) { | for ( var i = 0; i < lines.length; i++ ){ | ||
var line = lines[ i ].split( delie ); | |||
for ( var j = 0; j < line.length; j++ ){ | |||
var x = ( len[ j ] == undefined )? 0 : len[ j ] ; | |||
len[ j ] = ( blength( line[ j ] ) > x )? blength( line[ j ] ) : x; | |||
} | |||
} | } | ||
// 埋め込み。 | // 埋め込み。 | ||
for ( var i = 0; i < lines.length; i++ ) { | for ( var i = 0; i < lines.length; i++ ){ | ||
var line = lines[ i ].split( delie ); | |||
// Alert( line.join( " = " ) ); | |||
var work = []; | |||
for ( var j = 0; j < len.length; j++ ){ | |||
var s = ( line[ j ] == undefined )? "" : line[ j ]; | |||
work.push( padding( s, len[ j ], align, leftmargin, rightmargin, pad )); | |||
} | |||
output.push( work.join( separator )); | |||
} | } | ||
| 153行目: | 160行目: | ||
ClipboardData.SetData( output.join( "\r\n" ) + "\r\n"); | ClipboardData.SetData( output.join( "\r\n" ) + "\r\n"); | ||
Alert( "クリップボードにコピーしました。" ) | |||
// 指定桁数(半角)になるように spc を埋め込む。 | // 指定桁数(半角)になるように spc を埋め込む。 | ||
function padding( str, len, align, leftmargin, rightmargin, spc ){ | function padding( str, len, align, leftmargin, rightmargin, spc ){ | ||
var x = len - blength( str ); | |||
if ( align == "right" ){ | |||
return repeat( spc, x + leftmargin ) + str + repeat( spc, rightmargin ); | |||
} else if ( align == "center" ){ | |||
return repeat( spc, Math.floor( x / 2 ) + leftmargin ) + str + repeat( spc, x - Math.floor( x / 2 ) + rightmargin ); | |||
} else { | |||
return repeat( spc, leftmargin ) + str + repeat( spc, x + rightmargin ); | |||
} | |||
} | } | ||
// 文字列の繰り返し。 | // 文字列の繰り返し。 | ||
function repeat( str, n ) { | function repeat( str, n ){ | ||
var s = ""; | |||
for ( var i = 0; i < n; i++ ){ s += str } | |||
return s; | |||
} | } | ||
// 文字列の半角換算長さ。 | // 文字列の半角換算長さ。 | ||
function blength( str ) { | function blength( str ){ | ||
var blen = 0; | |||
for ( var i = 0; i < str.length; i++ ){ | |||
( isHan( str.charAt( i )))? blen += 1 : blen += 2; | |||
} | |||
return blen; | |||
} | } | ||
// 文字が半角のとき true。 | // 文字が半角のとき true。 | ||
function isHan( s ) { | function isHan( s ){ | ||
// Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff | |||
// Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3 | |||
var c = s.charCodeAt( 0 ); | |||
return (( c >= 0x0 && c < 0x81 ) || ( c == 0xf8f0 ) || ( c >= 0xff61 && c < 0xffa0 ) || ( c >= 0xf8f1 && c < 0xf8f4 )); | |||
} | } | ||
</ | </syntaxhighlight> | ||
2025年6月30日 (月) 00:31時点における最新版
概要[編集]
- TSV形式またはCSV形式から固定長へ変換します。
- 選択部分を対象とします。
- 変換結果はクリップボードにコピーします。
変数の説明[編集]
- auto_decision
- trueのとき、形式を自動判別します。
- popup_decision
- trueのとき、形式をポップアップメニューで指定します。
- auto_decision=falseのときのみ有効です。
- popup_align
- trueのとき、アラインメントをポップアップメニューで指定します。
- falseのときは、初期値となります。
- align
- アラインメントの文字列(初期値)です。
- left=左寄せ、right=右寄せ、center=中央揃えです。
- pad
- 各要素の余白に埋め込む文字です。通常は半角文字を指定します。
- leftmargin・rightmargin
- 各要素の左マージン・右マージンの数値です。その数だけpadを埋め込みます。
- separator
- 行内の各要素間に区切り文字が必要なときに適宜指定します。
注意事項[編集]
- 自動認識は、以下の優先順位で判断します(いずれにも合致しないときは、処理を中断します)。
- 選択文字列にタブ文字が含まれる場合は、タブ区切りとみなします。
- カンマの左右に「"」があるときは、引用符つきカンマ区切りとみなします。
- カンマがあるときは、カンマ区切りとみなします。
- auto_decisionとpopup_decisionの両方がfalseのときは、初期値(タブ区切り)で処理します。
動作環境(作成環境)[編集]
- Mery: Ver 2.1.5.4624
- OS: Windows 7 SP1 (64bit)
変更履歴[編集]
- 1.0.1 (2013-04-16)
- 空要素を含む場合にズレるのを修正
- 1.0.0 (2013-01-28)
- 初版
ソースコード[編集]
#title = "固定長に変換"
// tsv2fix.js
// 2013-04-16
var auto_decision = true; // true | false 簡易自動判別を利用するか。
var popup_decision = false; // true | false ポップアップメニューを利用するか。
var popup_align = false; // true | false ポップアップメニューを利用するか。
var leftmargin = 1; // 左マージン
var rightmargin = 1; // 右マージン
var separator = ""; // 要素の区切り文字(出力時)
var deli = "\t"; // 区切り文字
var align = "left"; // left | right | center アラインメントの初期値。
var pad = " "; // 埋め込む文字
var str = Document.selection.Text;
var len = [];
var output = [];
if ( auto_decision ){
// --- 簡易自動判別。 ---
if ( /\t/.test( str ) ){ // タブ区切り
deli = /\t/
} else if ( /", *"/.test( str ) ){ // 引用符つきカンマ区切り
str = str.replace( /^"|"$/gm, "");
deli = "\", *\"";
} else if ( /, */.test( str ) ){ // カンマ区切り
deli = ", *";
} else {
Quit();
}
} else if ( popup_decision ){
// --- ポップアップメニューで指定する。 ---
var menu = CreatePopupMenu();
menu.Add( "タブ区切り", 1, 0 );
menu.Add( "カンマ区切り", 2, 0 );
menu.Add( "引用符つきカンマ区切り", 3, 0 );
menu.Add( "その他", 4, 0 );
var r = menu.Track( mePosMouse );
switch( r ){
case 0:
Quit();
case 1:
break;
case 2:
deli = /, */
break;
case 3:
str = str.replace( /^"|"$/gm, "");
deli = "\", *\"";
break;
case 4:
deli = prompt( "区切り文字(正規表現・スラッシュ不要)?", "" );
if ( deli == "" ){ Quit() };
break;
default :
}
}
var delie = new RegExp( deli, "i" );
if ( popup_align ){
// --- ポップアップメニューでアラインメントを指定する。 ---
var menu = CreatePopupMenu();
menu.Add( "左寄せ", 1, 0 );
menu.Add( "右寄せ", 2, 0 );
menu.Add( "センタリング", 3, 0 );
var r = menu.Track( mePosMouse );
switch( r ){
case 0:
Quit();
case 1:
align = "left";
break;
case 2:
align = "right";
break;
case 3:
align = "center";
break;
default :
}
}
var delix = new RegExp( "(" + deli + ")("+ deli + ")", "ig" );
str = str.replace( delix, "$1 $2" );
var lines = str.replace( /\s+$/, "" ).split ( "\n" );
// 各列の最大長を調べる。
for ( var i = 0; i < lines.length; i++ ){
var line = lines[ i ].split( delie );
for ( var j = 0; j < line.length; j++ ){
var x = ( len[ j ] == undefined )? 0 : len[ j ] ;
len[ j ] = ( blength( line[ j ] ) > x )? blength( line[ j ] ) : x;
}
}
// 埋め込み。
for ( var i = 0; i < lines.length; i++ ){
var line = lines[ i ].split( delie );
// Alert( line.join( " = " ) );
var work = [];
for ( var j = 0; j < len.length; j++ ){
var s = ( line[ j ] == undefined )? "" : line[ j ];
work.push( padding( s, len[ j ], align, leftmargin, rightmargin, pad ));
}
output.push( work.join( separator ));
}
/*
Editor.ActiveDocument.Selection.EndOfDocument( false );
Editor.ActiveDocument.Write( output.join( "\r\n" ) );
*/
ClipboardData.SetData( output.join( "\r\n" ) + "\r\n");
Alert( "クリップボードにコピーしました。" )
// 指定桁数(半角)になるように spc を埋め込む。
function padding( str, len, align, leftmargin, rightmargin, spc ){
var x = len - blength( str );
if ( align == "right" ){
return repeat( spc, x + leftmargin ) + str + repeat( spc, rightmargin );
} else if ( align == "center" ){
return repeat( spc, Math.floor( x / 2 ) + leftmargin ) + str + repeat( spc, x - Math.floor( x / 2 ) + rightmargin );
} else {
return repeat( spc, leftmargin ) + str + repeat( spc, x + rightmargin );
}
}
// 文字列の繰り返し。
function repeat( str, n ){
var s = "";
for ( var i = 0; i < n; i++ ){ s += str }
return s;
}
// 文字列の半角換算長さ。
function blength( str ){
var blen = 0;
for ( var i = 0; i < str.length; i++ ){
( isHan( str.charAt( i )))? blen += 1 : blen += 2;
}
return blen;
}
// 文字が半角のとき true。
function isHan( s ){
// Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff
// Unicode : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
var c = s.charCodeAt( 0 );
return (( c >= 0x0 && c < 0x81 ) || ( c == 0xf8f0 ) || ( c >= 0xff61 && c < 0xffa0 ) || ( c >= 0xf8f1 && c < 0xf8f4 ));
}
スポンサーリンク