データのインポート
WorksheetおよびMatrixLayerクラスはDatasheetクラスから派生されます。 DatasheetクラスにはImportASCIIというメソッドがあります。 importASCIIメソッドは、ASCIIデータファイルをインポートするのに使われます。 Microsoft Excel および SPCデータファイルをそれぞれインポートするには、ImportExcel および ImportSPCというメソッドがあります。
ASCIIデータファイルをワークシートにインポート
ASCIIデータファイルをワークシートにインポート
最初のサンプルは、ASCIIデータファイルをアクティブワークブックのアクティブワークシートにインポートします。 最初にファイルフォーマットを検出するために、AscImpReadFileStructグローバル関数を呼び出します。 フォーマット情報は、ASCIMP構造に保存されています。 そして構造は、実際にインポートを行うImportASCII メソッドに渡されます。
ASCIIデータファイルをワークシートにインポート
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.");
}
インポートフィルタを使ってデータをインポートImport Data with Filter
ファイルインポートのための関数は、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オブジェクトへの参照。
|