「TSV(CSV) ⇒ 固定長」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
手石 (トーク | 投稿記録)
ページの作成:「=== 概要 === *TSV形式またはCSV形式から固定長へ変換します。 *選択部分を対象とします。 *変換結果はクリップボードにコピー...」
 
手石 (トーク | 投稿記録)
編集の要約なし
31行目: 31行目:


=== 動作(作成)環境 ===
=== 動作(作成)環境 ===
:Mery: ver 2.0.15.4235
:Mery: ver 2.1.5.4624
:OS: Windows 7 SP1 (64bit)
:OS: Windows 7 SP1 (64bit)


=== 更新履歴 ===
=== 更新履歴 ===
2013/01/28 初版
:2013/01/28 初版<br>
:2013/04/16 空要素を含む場合にズレるのを修正。


=== ソースコード ===
=== ソースコード ===
41行目: 42行目:
#title = "固定長に変換"
#title = "固定長に変換"
// tsv2fix.js
// tsv2fix.js
// 2013/01/28
// 2013/04/16


var auto_decision = true; // true | false  簡易自動判別を利用するか。
var auto_decision = true;   // true | false  簡易自動判別を利用するか。
var popup_decision = true; // true | false  ポップアップメニューを利用するか。
var popup_decision = false; // true | false  ポップアップメニューを利用するか。
var popup_align = false;   // true | 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 = /\t/;          // 区切り文字
var deli = "\t";          // 区切り文字
var align = "left";        // left | right | center  アラインメントの初期値。
var align = "left";        // left | right | center  アラインメントの初期値。
var pad = " ";            // 埋め込む文字
var pad = " ";            // 埋め込む文字
59行目: 60行目:
var output = [];
var output = [];


if ( auto_decision ) {
if ( auto_decision ){
// --- 簡易自動判別。 ---
    // --- 簡易自動判別。 ---
if ( /\t/.test( str ) ){ // タブ区切り
    if ( /\t/.test( str ) ){ // タブ区切り
deli = /\t/
        deli = /\t/
} else if ( /", *"/.test( str ) ){ // 引用符つきカンマ区切り
    } else if ( /", *"/.test( str ) ){ // 引用符つきカンマ区切り
str = str.replace( /^"|"$/gm, "");
        str = str.replace( /^"|"$/gm, "");
deli = /", *"/;
        deli = "\", *\"";
} else if ( /, */.test( str ) ){ // カンマ区切り
    } else if ( /, */.test( str ) ){ // カンマ区切り
deli = /, */;
        deli = ", *";
} else {
    } else {
Quit();
        Quit();
}
    }
} else if ( popup_decision ) {
} else if ( popup_decision ){
// --- ポップアップメニューで指定する。 ---
    // --- ポップアップメニューで指定する。 ---
var menu = CreatePopupMenu();
    var menu = CreatePopupMenu();
menu.Add( "タブ区切り", 1, 0 );
    menu.Add( "タブ区切り", 1, 0 );
menu.Add( "カンマ区切り", 2, 0 );
    menu.Add( "カンマ区切り", 2, 0 );
menu.Add( "引用符つきカンマ区切り", 3, 0 );
    menu.Add( "引用符つきカンマ区切り", 3, 0 );
menu.Add( "その他", 4, 0 );
    menu.Add( "その他", 4, 0 );  
var r = menu.Track( mePosMouse );
    var r = menu.Track( mePosMouse );


switch( r ){  
    switch( r ){  
case 0:
    case 0:
Quit();
        Quit();
case 1:
    case 1:
break;
        break;
case 2:
    case 2:
deli = ","
        deli = /, */
break;
        break;
case 3:
    case 3:
str = str.replace( /^"|"$/gm, "");
        str = str.replace( /^"|"$/gm, "");
deli = '","';
        deli = "\", *\"";
break;
        break;
case 4:
    case 4:
deli = prompt( "区切り文字(正規表現)?", "" );
        deli = prompt( "区切り文字(正規表現・スラッシュ不要)?", "" );
if ( deli == "" ) { Quit() };
        if ( deli == "" ){ Quit() };
deli = new RegExp( deli, "i" );
        break;
break;
    default :
default :
    }
}
}
}
var delie = new RegExp( deli, "i" );


if ( popup_align ) {
if ( popup_align ){
// --- ポップアップメニューでアラインメントを指定する。 ---
    // --- ポップアップメニューでアラインメントを指定する。 ---
var menu = CreatePopupMenu();
    var menu = CreatePopupMenu();
menu.Add( "左寄せ", 1, 0 );
    menu.Add( "左寄せ", 1, 0 );
menu.Add( "右寄せ", 2, 0 );
    menu.Add( "右寄せ", 2, 0 );
menu.Add( "センタリング", 3, 0 );
    menu.Add( "センタリング", 3, 0 );
var r = menu.Track( mePosMouse );
    var r = menu.Track( mePosMouse );


switch( r ){  
    switch( r ){  
case 0:
    case 0:
Quit();
        Quit();
case 1:
    case 1:
align = "left";
        align = "left";
break;
        break;
case 2:
    case 2:
align = "right";
        align = "right";
break;
        break;
case 3:
    case 3:
align = "center";
        align = "center";
break;
        break;
default :
    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( deli );
    var line = lines[ i ].split( delie );
for ( var j = 0; j < line.length; j++ ){
    for ( var j = 0; j < line.length; j++ ){
var x = ( len[ j ] == undefined ) ? 0 : len[ j ] ;
        var x = ( len[ j ] == undefined )? 0 : len[ j ] ;
len[ j ] = ( blength( line[ j ] ) > x ) ? blength( line[ j ] ) : x;
        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( deli );
    var line = lines[ i ].split( delie );
var work = [];
//  Alert( line.join( " = " ) );
for ( var j = 0; j < len.length; j++ ){
    var work = [];
var s = ( line[ j ] == undefined ) ? "" : line[ j ];
    for ( var j = 0; j < len.length; j++ ){
work.push( padding( s, len[ j ], align, leftmargin, rightmargin, pad ));
        var s = ( line[ j ] == undefined )? "" : line[ j ];
}
        work.push( padding( s, len[ j ], align, leftmargin, rightmargin, pad ));
output.push( work.join( separator ));
    }
    output.push( work.join( separator ));
}
}


153行目: 158行目:


ClipboardData.SetData( output.join( "\r\n" ) + "\r\n");
ClipboardData.SetData( output.join( "\r\n" ) + "\r\n");
// Alert( "クリップボードにコピーしました。" )
Alert( "クリップボードにコピーしました。" )


// 指定桁数(半角)になるように spc を埋め込む。
// 指定桁数(半角)になるように spc を埋め込む。
function padding( str, len, align, leftmargin, rightmargin, spc ){
function padding( str, len, align, leftmargin, rightmargin, spc ){
var x = len - blength( str );
    var x = len - blength( str );
if ( align == "right" ) {
    if ( align == "right" ){
return repeat( spc, x + leftmargin) + str + repeat( spc, rightmargin );
        return repeat( spc, x + leftmargin ) + str + repeat( spc, rightmargin );
} else if ( align == "center" ) {
    } else if ( align == "center" ){
return repeat( spc, Math.floor( x / 2 ) + leftmargin ) + str + repeat( spc, x - Math.floor( x / 2 ) + rightmargin );
        return repeat( spc, Math.floor( x / 2 ) + leftmargin ) + str + repeat( spc, x - Math.floor( x / 2 ) + rightmargin );
} else {
    } else {
return repeat( spc, leftmargin ) + str + repeat( spc, x + rightmargin );
        return repeat( spc, leftmargin ) + str + repeat( spc, x + rightmargin );
}
    }
}
}


// 文字列の繰り返し。
// 文字列の繰り返し。
function repeat( str, n ) {
function repeat( str, n ){
var s = "";
    var s = "";
for ( var i = 0; i < n; i++ ){ s += str }
    for ( var i = 0; i < n; i++ ){ s += str }
return s;
    return s;
}
}


// 文字列の半角換算長さ。
// 文字列の半角換算長さ。
function blength( str ) {
function blength( str ){
var blen = 0;
    var blen = 0;
for ( var i = 0; i < str.length; i++ ) {
    for ( var i = 0; i < str.length; i++ ){
( isHan( str.charAt( i ))) ? blen += 1 : blen += 2;
        ( isHan( str.charAt( i )))? blen += 1 : blen += 2;
}
    }
return blen;
    return blen;
}
}


// 文字が半角のとき true。
// 文字が半角のとき true。
function isHan( s ) {
function isHan( s ){
// Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff
    // Shift_JIS: 0x0 ~ 0x80, 0xa0 , 0xa1 ~ 0xdf , 0xfd ~ 0xff
// Unicode  : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
    // Unicode  : 0x0 ~ 0x80, 0xf8f0, 0xff61 ~ 0xff9f, 0xf8f1 ~ 0xf8f3
var c = s.charCodeAt( 0 );
    var c = s.charCodeAt( 0 );
return (( c >= 0x0 && c < 0x81 ) || ( c == 0xf8f0 ) || ( c >= 0xff61 && c < 0xffa0 ) || ( c >= 0xf8f1 && c < 0xf8f4 ));
    return (( c >= 0x0 && c < 0x81 ) || ( c == 0xf8f0 ) || ( c >= 0xff61 && c < 0xffa0 ) || ( c >= 0xf8f1 && c < 0xf8f4 ));
}
}
</pre>
</pre>

2013年4月16日 (火) 18:21時点における版

概要

  • TSV形式またはCSV形式から固定長へ変換します。
  • 選択部分を対象とします。
  • 変換結果はクリップボードにコピーします。

変数の説明

auto_decision
trueのとき、形式を自動判別します。
popup_decision
trueのとき、形式をポップアップメニューで指定します。
auto_decision=falseのときのみ有効です。
popup_align
trueのとき、アラインメントをポップアップメニューで指定します。
falseのときは、初期値となります。
align
アラインメントの文字列(初期値)です。
left=左寄せ、right=右寄せ、center=中央揃えです。
pad
各要素の余白に埋め込む文字です。通常は半角文字を指定します。
leftmargin・rightmargin
各要素の左マージン・右マージンの数値です。その数だけpadを埋め込みます。
separator
行内の各要素間に区切り文字が必要なときに適宜指定します。

注意点

  • 自動認識は、以下の優先順位で判断します。(いずれにも合致しないときは、処理を中断します。)
  1. 選択文字列にタブ文字が含まれる場合は、タブ区切りとみなします。
  2. カンマの左右に「"」があるときは、引用符つきカンマ区切りとみなします。
  3. カンマがあるときは、カンマ区切りとみなします。
  • auto_decisionとpopup_decisionの両方がfalseのときは、初期値(タブ区切り)で処理します。

動作(作成)環境

Mery: ver 2.1.5.4624
OS: Windows 7 SP1 (64bit)

更新履歴

2013/01/28 初版
2013/04/16 空要素を含む場合にズレるのを修正。

ソースコード

#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 ));
}
スポンサーリンク