WorksheetおよびMatrixLayerクラスはDatasheetクラスから派生されます。 DatasheetクラスにはImportASCIIというメソッドがあります。 importASCIIメソッドは、ASCIIデータファイルをインポートするのに使われます。 Microsoft Excel および SPCデータファイルをそれぞれインポートするには、ImportExcel および ImportSPCというメソッドがあります。
最初のサンプルは、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(); // 内容に合うように列幅を調整 } }
データを行列シートにインポートすることは、ワークシートへのインポートに似ています。 この例は、最初のワークシート例に似ています。 違いは、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)
ここで、
または、
int YourFunctionName(Layer& lyTarget, TreeNode& trFilter, LPCSTR lpcszFile, int 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);
ここで、