2012-04-10

Windowsバッチファイル : テキストファイルの文字コードを変換したい


Windowsバッチファイルでテキストファイルの文字コードを変換したい



○ テキストファイルの文字コードを変換したい

  • 文字コードセット:UTF-8 のファイル(utf8.txt)を用意する
  • バッチ実行ディレクトリに「unicode.txt」「sjis.txt」が出力される
@ECHO OFF

REM 文字コードセット:UTF-8 → Unicode
START /MIN /WAIT CMD /C CHCP 65001 ^& ^( SET /P x=""^<nul ^& CMD /U /C TYPE utf8.txt ^) ^>unicode.txt

REM 文字コードセット:Unicode → Shuft-JIS
START /MIN /WAIT CMD /C CHCP 932 ^& CMD /C TYPE unicode.txt ^>sjis.txt
※ [SET /P="(文字列)"<nul]の"(文字列)"がなんなのかは知らない


■ START
START ["タイトル"] [/D パス] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
 [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
 [/NODE ] [/AFFINITY <16 進数の関係マスク>] [/WAIT] [/B]
 [コマンド/プログラム] [パラメーター]
  • 指定されたプログラムまたはコマンドを実行するためにウィンドウを開き
  • オプション
    • /MIN : ウィンドウを最小化した状態で起動する
    • /WAIT : アプリケーションを起動し、それが終了するまで待機する
    • ※ その他は下記を参照
      help start
      


■ CMD
CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] [[/S] [/C | /K] 文字列]
  • Windows コマンド インタープリターの新しいインスタンスを開始する
  • オプション
    • /C : "文字列" に指定されたコマンドを実行した後、終了する
    • /U : 内部コマンドの出力結果を Unicode でパイプまたはファイルに出力する
    • ※ その他は下記で参照
      help cmd
      


■ CHCP
CHCP [nnn]
  • 現在のコード ページ番号を表示または設定する
  • オプション
    • nnn : コードページ番号
    • ※ その他は下記で参照
      help chcp
      


■ SET
SET [変数名=[文字列]]
  • cmd.exe 環境変数を表示、設定、または削除する
  • オプション
    • SET /P="文字列"<NUl :改行しないで文字列を出力する
    • ※ その他は下記で参照
      help set
      



◇ 環境

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.




◇ 参考


Force.com : 起動 - Data Loader CLIq


CLIp の起動



◆ 起動

  1. $ApexDataLoader_HOME/cliq/cliq.bat をクリックする
  2. バッチが実行され、以下の画面が表示されれば起動成功





◇ 環境

  • Salesforce - Enterprise Edition - API バージョン 24.0
  • Apex Data Loader 23
  • CLIp Release 2.1.1

Force.com : 起動(sandbox 環境) - Data Loader CLIq


sandbox 環境で CLIp の起動



◆ cliq.properties の修正

  1. $ApexDataLoader_HOME/cliq/cliq.properties を修正する
    # Use https://test.salesforce.com/services/Soap/u/ for Sandbox instances
    # NOTE: Make sure the version is equal or lower than your version of Data Loader.
    #
    # For example:
    # sfdc.endpoint=https://test.salesforce.com/services/Soap/u/21.0
    
       ↓↓↓
    # Use https://test.salesforce.com/services/Soap/u/ for Sandbox instances
    # NOTE: Make sure the version is equal or lower than your version of Data Loader.
    #
    # For example:
    sfdc.endpoint=https://test.salesforce.com/services/Soap/u/23.0
    
    ※ [Apex Data Loader 23]を使用しているため[YOUR DATA LOADER VERSION]を「23.0」としている



◆ sandbox 環境で起動

  1. $ApexDataLoader_HOME/cliq/cliq.bat をクリックする
  2. バッチが実行され、以下の画面が表示されれば起動成功


  3. 次の画面(Ex. Export)へ進むと、上記に sandbox の URL が表示されていることを確認(「https://test.sa ...」)


    ※ 以前のバージョンに URL が表示される個所なんてなかった気がする



◇ 環境

  • Salesforce - Enterprise Edition - API バージョン 24.0
  • Apex Data Loader 23
  • CLIp Release 2.1.1




2012-04-04

Force.com : Apex でオブジェクト及び項目の情報を取得する


Apex でオブジェクト及び項目の情報を取得する



○ すべてのオブジェクト及び項目の情報を取得する

Map<String, Schema.SObjectType> smap = Schema.getGlobalDescribe();
for (String objKey : smap.keySet()) {

    // Object
    System.debug('##### key: object API reference name: ' + objKey);

    Schema.SObjectType sobj = smap.get(objKey);
    Schema.DescribeSObjectResult sr = sobj.getDescribe();

    System.debug('##### object is Custom: ' + sr.isCustom());
    System.debug('##### object label: ' + sr.getLabel());
    System.debug('##### object API reference name: ' + sr.getName());

    // field
    Map<String, Schema.SObjectField> fmap = sr.fields.getMap();
    for (String fieldKey : fmap.keySet()) {

        System.debug('***** key: field API reference name: ' + fieldKey);

        Schema.SObjectField f = fmap.get(fieldKey);
        Schema.DescribeFieldResult fr = f.getDescribe();

        System.debug('***** field is Custom: ' + fr.isCustom());
        System.debug('***** field label: ' + fr.getLabel());
        System.debug('***** field API reference name: ' + fr.getName());
        System.debug('***** field type: ' + fr.getType());

        if(fr.getController() != null) {
            System.debug('***** field is controller');
            System.debug('***** controller'
                        + ' label: ' + fr.getController().getDescribe().getLabel());
                        + ' name: ' + fr.getController().getDescribe().getName());
        }

        if(fr.getReferenceTo().isEmpty()) {
            System.debug('***** field is reference to');
            List<Schema.sObjectType> olist = fr.getReferenceTo();
            for(Schema.sObjectType o : olist) {
                System.debug('***** reference to'
                                + ' label:' + o.getDescribe().getLabel() 
                                + ' API reference name:' + o.getDescribe().getName());
            }
        }

        if(!fr.getPicklistValues().isEmpty()) {
            System.debug('***** field is picklist');
            List<Schema.PicklistEntry> plist = fr.getPicklistValues();
            for(Schema.PicklistEntry e : plist) {
                System.debug('***** picklist'
                                + ' label:' + e.getLabel() 
                                + ' value:' + e.getValue());
            }
        }
    }
}



○ オブジェクト

■ カスタムオブジェクトかの判定 (ex. 取引先)
Account.sObjectType.getDescribe().isCustom()
  • true: カスタムオブジェクト
  • false: 標準オブジェクト
■ 表示ラベル (ex. 取引先)
Account.sObjectType.getDescribe().getLabel()
■ API 参照名 (ex. 取引先)
Account.sObjectType.getDescribe().getName()



○ 項目

■ カスタムオブジェクトかの判定 (ex. 取引先.取引先名)
Account.Name.getDescribe().isCustom()
  • true: カスタム項目
  • false: 標準項目
■ 表示ラベル (ex. 取引先.取引先名)
Account.Name.getDescribe().getLabel()
■ API 参照名 (ex. 取引先.取引先名)
Account.Name.getDescribe().getName()
■ データ型 (ex. 取引先.取引先名)
Account.Name.getDescribe().getType()
■ 制御項目 (ex. 取引先.種別)
Account.Type.getDescribe().getController()
  • 制御項目の設定がなければ null
  • 制御項目の設定があれば getDescribe() で制御側項目の詳細の取得が可能
■ 参照関係 (ex. 取引先.最終更新者)
Account.LastModifiedById.getDescribe().getReferenceTo()
  • 参照関係でなければ空
  • 参照関係であれば getDescribe で参照先オブジェクトの詳細の取得が可能
■ 選択リスト (ex. 取引先.種別)
Account.Type.getDescribe().getPicklistValues()
  • 選択リストでなければ空
  • 選択リストであれば値の Schema.PicklistEntry からラベルと値が取得可能



◆ メモ

  • 詳細、その他は参考先を参照のこと



◇ 環境

  • Salesforce - Developer Edition - API バージョン 24.0



◇ 参考


2012-04-02

Force.com : Apex で数値を文字列に変換したい


Apex で数値を文字列に変換したい



○ Integer#format()

Integer i = 12344567890;
System.debug(i.format());
■ 実行結果
1,234,567,890
Integer Methods の説明より
Returns the integer as a string using the locale of the context user
→ 戻り値はユーザのロケールを使用して整数値を文字列とする



◆ メモ

  • てっきり、Java の
    java.lang.Integer.toString(int i) 
    みたいなものだと思っていたら全く違っていた
  • 他も同じっぽい
    • Long#format()
    • Double#format()
    • Decimal#format()



○ String.valueOf(Integer i)

Integer i = 12344567890;
System.debug(String.valueOf(i));
// or
System.debug('' + i);
■ 実行結果
1234567890



◆ メモ

  • Java だと
    java.lang.String.valueOf(int i)
    
    public static String valueOf(int i) {
        return Integer.toString(i);
    }
    
    使うより、
    java.lang.Integer.toString(int i) 
    
    public static String toString(int i) {
        if (i == Integer.MIN_VALUE)
            return "-2147483648";
        int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
        char[] buf = new char[size];
        getChars(i, size, buf);
        return new String(0, size, buf);
    }
    
    使ったほうがメソッドの呼び出し回数が減るから後者を使っていたのだけれども迂闊だった
    (たぶん今も、前者のメソッドで後者のメソッドを呼び出していたはず)
  • 時折 Force.com Apex Code Developer's Guide に目を通そう!



◇ 環境

  • Salesforce - Developer Edition - API バージョン 24.0



◇ 参考


Force.com : Apex で数値がある桁数に満たない場合に左(上位桁)を 0 埋めしたい


Apex で数値がある桁数に満たない場合に左(上位桁)を 0 埋めしたい



○ 数値がある桁数に満たない場合に左(上位桁)を 0 埋めしたい

/**
 * パッディング:左ゼロ埋め
 * @param n 数値
 * @param len 桁数(数値の桁を含める)
 * @return 
 */
public String paddingLeftZero(Integer n, Integer len) {
    Integer nlen = (Math.floor(Math.log10(Double.valueOf(n))).intValue() + 1);
    if(nlen >= len) return String.valueOf(n);
    String s = '';
    for(Integer i=0, l=len-nlen; i<l; i++) {
        s += '0';
    }
    return s + String.valueOf(n);
}



◆ メモ

  • 桁数を超える数値はどうでもいいことにする
  • 数値の桁数を求めるところは
    Integer nlen = n.format().length();
    
    でもよかったのかもしれないと思いつつ、なんとなくこれは習慣



◇ 環境

  • Salesforce - Developer Edition - API バージョン 24.0