データのインポート


WorksheetおよびMatrixLayerクラスはDatasheetクラスから派生されます。 DatasheetクラスにはImportASCIIというメソッドがあります。 importASCIIメソッドは、ASCIIデータファイルをインポートするのに使われます。 Microsoft Excel および SPCデータファイルをそれぞれインポートするには、ImportExcel および ImportSPCというメソッドがあります。

ASCIIデータファイルをワークシートにインポート

最初のサンプルは、ASCIIデータファイルをアクティブワークブックのアクティブワークシートにインポートします。 最初にファイルフォーマットを検出するために、AscImpReadFileStructグローバル関数を呼び出します。 フォーマット情報は、ASCIMP構造に保存されています。 そして構造は、実際にインポートを行うImportASCII メソッドに渡されます。

string strFile = "D:\\data.dat"; // いくつかのデータファイル名
ASCIMP	ai;
if(0 == AscImpReadFileStruct(strFile, &ai) )
{
    // このサンプルでは、LabTalkのシステム変数@NPOを0にして
    //ASCIIインポートのプログレスバーを無効
    // これは任意で、ここで可能であることを表示
    // LTVarTempChangeクラスは
    // LabTalk変数を簡単に設定および  元に戻すLTVarTempChangeについての詳細は
    // LabTalkにアクセスするセクションをご覧ください
    LTVarTempChange progressBar("@NPO", 0); // 0 = プログレスバーを無効化

    // アクティブワークブックからアクティブワークシートを取得
    Worksheet wks = Project.ActiveLayer();

    if(0 == wks.ImportASCII(strFile, ai))
        out_str("Import data successful.");
}

次のサンプルは、ASCIIデータファイルをワークシートにインポートしますが、ファイルから各列の情報も取得し、ワークシート列をセットアップします。

// ファイルを開くダイアログでユーザにインポートするファイルの選択を促す
string 	strFile = GetOpenBox("*.dat");
if( strFile.IsEmpty() )
    return; // ユーザがキャンセルあるいはエラー

ASCIMP	ai;
if( 0 == AscImpReadFileStruct(strFile, &ai) )
{
    ai.iAutoSubheaderLines = 0; // 自動検出サブヘッダを無効化 

    // 1, ロングネーム
    // 2.単位	
    // 3.拡張された説明(ユーザ定義)
    // 4.データ型の指示(ユーザ定義)
    ai.iSubheaderLines = 4; 

    // iAutoSubheaderLinesがfalse(0)のとき、ai.nLongName, ai.nUnits, ai.nFirstUserParamsの 
    // 開始インデックスがメインヘッダから取得
    ai.nLongNames = ai.iheaderLines; 
    ai.nUnits = ai.iheaderLines + 1;  

    // 最初のユーザパラメータのインデックスをセット
    ai.nFirstUserParams = ai.iheaderLines + 2; 
    ai.nNumUserParams = 2; // ユーザパラメータの数をセット

    // コメントラベルにヘッダをセットしない
    ai.iMaxLabels = 0; 

    // アクティブワークブックからアクティブワークシートを取得
    Worksheet wks = Project.ActiveLayer();

    if( 0 == wks.ImportASCII(strFile, ai) ) // エラーなしは0を返す
    {
        // ユーザパラメータラベルの名前
        vector<string> vsUserLabels = {"Expanded Description", "Type Indication"};

        // ユーザパラメータラベルを指定した名前にセット
        Grid grid;
        grid.Attach(wks);
        grid.SetUserDefinedLabelNames(vsUserLabels);

        wks.AutoSize(); // 内容に合うように列幅を調整
    }
}

ASCIIデータファイルを行列シートにインポート

データを行列シートにインポートすることは、ワークシートへのインポートに似ています。 この例は、最初のワークシート例に似ています。 違いは、Worksheet クラスではなく、 MatrixLayerクラスを使って、アクティブな行列ブックからアクティブな行列シートを取得するという点です。

string strFile = "D:\\someData.dat";
ASCIMP ai;
if( 0 == AscImpReadFileStruct(strFile, &ai) )
{
    MatrixLayer ml = Project.ActiveLayer();	
    if( 0 == ml.ImportASCII(strFile, ai) )
        out_str("Data imported successfully.");
}

インポートフィルタを使ってデータをインポート

ファイルインポートのための関数は、OriginC\Originlab\FileImport.h ファイル内で宣言されます。これらの関数は、Origin Cの言語リファレンスヘルプに説明があります。

ファイルインポート関数を呼ぶ前に、最初にプログラムでFileImport.cをロードし、コンパイルする必要があります。これは、コマンドを使ってスクリプトから行うことができます。

run.LoadOC(Originlab\FileImport.c, 16);
// 16というオプションは、FileImport.cファイルのcorresponding .hで
// スキャンすることで、すべてのOrigin C依存ファイルがロードされるようにする

次のサンプルは、フィルタファイルでデータをインポートすることを示しています。

#include <..\Originlab\FileImport.h>
void import_with_filter_file()
{
    Page pg = Project.Pages(); // アクティブページ
 
    // ページブック名を取得
    string strPageName = pg.GetName();
 
    // ページのアクティブインデックスを取得
    int nIndexLayer = pg.Layers().GetIndex();
 
    // Originのサンプルフォルダを取得
    string strPath = GetAppPath(TRUE) + "Samples\\Signal Processing\\";
 
    // .oif フィルタ名を指定
    string strFilterName = "TR Data Files";
 
    import_file(strPageName, nIndexLayer, strPath + "TR2MM.dat", strFilterName);
}

データフォーマットに合わせるために、既存のフィルタを修正し、ファイルからフィルタをロードし、設定する必要があるかもしれません。次のケースを確認してください。

#include <..\Originlab\FileImport.h>
void    config_filter_tree()
{
    string strFile = GetAppPath(1) + "Samples\\Curve Fitting\\Step01.dat";
    if( !strFile.IsFile() )
        return;  
 
    // ツリーにフィルタをロード
    Tree trFilter;    
    string strFilterName = "ASCII";
    int nLocation = 1; // 組み込みのフィルタフォルダ
    Worksheet wks;
    wks.Create("origin");
    WorksheetPage wp = wks.GetPage();
    string strPageName = wp.GetName();
    int nRet = load_import_filter(strFilterName, strFile,
                                strPageName, nLocation, trFilter);
    if( 0 != nRet )
        out_str("Failed to load import filter"); 
    
    // フィルタツリー更新
    trFilter.iRenameCols.nVal = 0; // 0はデフォルトの列名を保持、1は列の名前を変更
    
    // フィルタツリーでデータファイルをインポート
    // import_files 関数は、一度に複数ファイルのインポートをサポート
    vector<string> vsDataFileName;
    vsDataFileName.Add(strFile);    
    nRet = import_files(vsDataFileName, strPageName, wks.GetIndex(), trFilter);	
    if( 0 != nRet )
        out_str("Failed to import file");
}

インポートウィザードでファイルをインポート

インポートするファイルが、ASCIIファイルでも単純なバイナリファイルでもない場合、あるいは、データファイルのインポートフィルタがない場合は、Origin Cの impFile Xファンクションを使用し、インポートウィザードウィザードでファイルをインポートできます。

Origin C 関数は、次のプロトタイプのどちらかを使います。

int YourFunctionName(Page& pgTarget, TreeNode& trFilter, LPCSTR lpcszFile, int nFile)

ここで、

  • pgTarget: worksheet型またはMatrix型のPageオブジェクトへの参照。 これは、自分のフィルタ内またはインポートウィザードの「データソース」ページでターゲットウィンドウとして定義するものです。
  • trFilter: フィルタファイルまたはウィザードの指定からのすべてのフィルタ設定を持つツリー構造でのTreeNodeオブジェクトへの参照。
  • lpcszFile: インポートするファイルのフルパスと名前
  • nFile: インポートするファイルの順序を示すファイルインデックス番号 (例えば、n 個のファイルをインポートする場合、関数はn回呼び出され、nFile は処理されるファイルの数となります。

または、

int YourFunctionName(Layer& lyTarget, TreeNode& trFilter, LPCSTR lpcszFile, int nFile)

ここで、

  • lyTarget:orksheet型またはMatrix型のLayerオブジェクトへの参照。 これは、自分のフィルタ内またはインポートウィザードの「データソース」ページでターゲットウィンドウとして定義するものです。
  • trFilter: フィルタファイルまたはウィザードの指定からのすべてのフィルタ設定を持つツリー構造でのTreeNodeオブジェクトへの参照。
  • lpcszFile: インポートするファイルのフルパスと名前
  • nFile: インポートするファイルの順序を示すファイルインデックス番号 (例えば、n 個のファイルをインポートする場合、関数はn回呼び出され、nFile は処理されるファイルの数となります。

Originのインストールフォルダの、\Samples\Import と Export\User Defined フォルダにサンプルがあります。

Note: インポートウィザードの最初のページ(データソースページ)にあるターゲットウィンドウテンプレートの名前は、新しいウィンドウを作成するときだけ使われます(ドラッグ&ドロップインポート時にはいくつか条件があります)。 ファイル:インポートを選択するとき、アクティブウィンドウがインポートフィルタのターゲットウィンドウとして設定されていると、新しいウィンドウは作成されず、アクティブウィンドウへのpageオブジェクトの参照が関数に渡されます。 アクティブウィンドウが異なるタイプの場合、指定したテンプレートで新しいウィンドウが作成され、この新しいウィンドウへのpage参照が渡されます。


インポートウィザードで変数を拡張

インポートウィザードでASCIIファイルをインポートするとき、ユーザ定義のOrigin C関数を使ってファイルヘッダから変数を抽出することができます。

Origin C 関数は、次のようなプロトタイプになっている必要があります。

int FuncName(StringArray& saVarNames, StringArray& saVarValues, const StringArray& saHdrLines, const TreeNode &trFilter);

ここで、

  • saVarNames: 変数名を配置する文字列配列
  • saVarValues: 変数値を配置する文字列配列
  • saHdrLines: ヘッダ行を含む文字列配列への参照。 ヘッダ行が自動的に関数に渡されるので、Origin C関数はデータファイルを読み込む必要はありません。
  • trFilter: フィルタファイルまたはウィザードの指定からのすべてのフィルタ設定を持つツリー構造でのTreeNodeオブジェクトへの参照。