Originには、ASCII、CSV、Excel、National Instruments DIAdem、pCLAMPなど様々なデータファイルをインポートするためのXファンクションがあります。各ファイルフォーマットごとのオプション設定のほか、インポートファイルの名前をブックやシート名にするといった共通の設定が可能です。
インポートに関するXファンクション名は、すべてimpから始まります。これらのXファンクションに関する詳細は、こちらを参照してください。
ユーザ独自のインポートルーチンをXファンクションとして作成することもできます。作成したXファンクションの名前をimpから始まるものにし、Originインストールフォルダやユーザファイルフォルダ、グループパスの\X-Functions\Import and Exportサブフォルダに置けば、データ:ファイルからインポートメニューに表示できます。
インポートの機能と、システムブラウザの機能(dlgfileやfindfiles)には、共通のパラメータfnameがあります。fnameは、ファイル名のみまたは、ファイルのパスやリストを保持できる文字列変数です。インポートのXファンクションは、複数ファイルを扱えます。複数ファイルをどう扱うか、つまり、追加ファイルのために新しいブックを作成するのかあるいは、シートや列を作成するのかについてのデフォルト設定はXファンクションごとに異なります。これはインポート機能のオプションによって変更可能です。
GUIからインポートのXファンクションを使用するとき、カスタマイズした設定をテーマとして保存できます。テーマファイルは、拡張子.OISのファイルとしてユーザファイルフォルダ(UFF)の\Themes\AnalysisAndReportTableに保存されます。関連するXファンクションの-tオプションスイッチを使用して、保存したテーマファイルにアクセスでき、テーマに保存された設定を使用したインポートが可能です。
サンプル:
string fn$=system.path.program$ + "Samples\Spectroscopy\HiddenPeaks.dat"; // "My Theme.OIS" というテーマファイルがあることが前提 impasc fname:=fn$ -t "My Theme";
アメリカのGDPデータをWebサイトから取得し、ヘッダ部分を除いたデータをインポートします。ヘッダの内容は、最初の列のコメント行に入力します。
string fname$="%YUSGDP.txt"; url$="https://research.stlouisfed.org/fred2/data/GDP.txt"; web2file; if( exist(fname$) <= 0) { type "failed to get " + url$; return 0; } //プロジェクトをクリアしてからの空の状態から開始 doc -s;doc -n;{win -cd}; newbook s:=1; // インポートのためにヘッダ構造を指定 impASC options.sparklines:=0 options.FileStruct.DateFormat:="yyyy'-'MM'-'dd" options.Hdr.MainHdrLns:=19 options.Hdr.AutoSubHdr:=0 options.Hdr.SubHdrLns:=1 options.Hdr.Units:=0; // ヘッダにある文字列はシステム変数__headERに保存されるので // これを1列目のコメント行に置く range aa=1; aa[C]$=__headER$; wks.labels(LC);//ロングネームとコメントを表示
XファンクションimpASCのオプションツリーは、名前のオプションや部分インポートのオプションを設定できます。例えば、ダイアログを使用して複数のファイルを指定し、各ファイルの一部(10行)をインポートして列3データの検定を実行します。データが基準を満たせばすべてのファイルをインポートし、そうでない場合スキップします。
インポートされたファイルのファイル名はワークブックのコメントに格納されます。Samples\Curve Fittingフォルダにある12個のSTEP##.DATファイルでこのコードを実行すると、7個のファイルがスキップされ、5個のファイルがインポートされます。
newbook; dlgfile gr:=*.dat mu:=1; string file$; loop(ii,1,fname.GetNumTokens(CRLF)) { file$ = fname.GetToken(ii,CRLF)$; impasc fname:=file$ options.Names.AutoNames:= 0 options.Names.FNameToSht:= 0 options.Names.FNameToBk:= 0 options.Names.FNameToBkComm:= 0 options.PartImp.Partial:= 1 options.PartImp.LastRow:= 10; stats 3; wclear msg:=0; if( stats.mean > .01 && stats.mean < .4 ) { impasc fname:=file$ options.Names.AutoNames:=0 options.Names.FNameToSht:=1 options.Names.FNameToBk:=0 options.Names.FNameToBkComm:= 1 options.PartImp.Partial:=0; if( ii != fname.GetNumTokens(CRLF) ) newsheet; } else { type Skipping %(file$); if( ii == fname.GetNumTokens(CRLF) ) layer -d; } }
XファンクションimpASCのオプションツリーは、区切り文字と数値の区切りオプションを設定できます。これら2つのオプションは、オプションツリーのFileStructノードにあります。
以下が区切り文字のオプション(options.FileStruct.Delimiter)です。
以下が区切り文字のオプション(options.FileStruct.NumericSeparator)です。
次のデータは単純なTab区切りデータファイルです。
1 1,010.00 1,240.00 2 3,020.01 2,562.01 3 4,030.00 3,680.00 4 6,040.01 4,002.01 5 7,050.00 5,440.00 6 7,060.01 6,002.01 7 8,982.99 3,456.23
以下は、このデータを使用したサンプルです。実行する前に、上のデータをC:\tempData.txt に保存するか、同じファイル形式のデータファイル名に変更してください。
impASC fname:=c:\tempData.txt options.FileStruct.Delimiter:=2 options.FileStruct.NumericSeparator:=0;
次のサンプルでは、他の区切り文字オプションを使用します。上のサンプルデータの区切り文字がバーティカルバーであった場合、options.FileStruct.Delimiterを5にし、options.FileStruct.OtherDelimiterを"|"にします。
impASC fname:=d:\tempData.txt options.FileStruct.Delimiter:=5 options.FileStruct.OtherDelimiter:="|" options.FileStruct.NumericSeparator:=0;
このサンプルは、 impAsc Xファンクションの多くの詳細オプションの使用方法を説明します。このサンプルでは、XファンクションimpAscのオプションを使って名前を変更された新しいブックにファイルをインポートします。
string fn$=system.path.program$ + "Samples\Spectroscopy\HiddenPeaks.dat"; impasc fname:=fn$ options.ImpMode:=3 /* 新しいブックで開始 */ options.Sparklines:=0 /* スパークラインオフ */ options.Names.AutoNames:=0 /* 自動名前変更オフ */ options.Names.FNameToSht:=1 /* シート名をファイル名にする */ options.Miscellaneous.LeadingZeros:=1; /* 先行ゼロを削除 */
サンプル 1
次のサンプルでは、複数データファイルを新しいワークブックにインポートしてファイルごとに新しいシートを作成します。
string fns, path$=system.path.program$ + "Samples\Curve Fitting\"; // findFilesはデフォルトでpath$から取得 findfiles fname:=fns$ ext:="step1*.dat"; int n = fns.GetNumTokens(CRLF); string bkName$; newbook s:=0 result:=bkName$; impasc fname:=fns$ options.ImpMode:=4 /* 新規シートを開始 */ options.Sparklines:=2 /* < 50のときスパークラインを追加 */ options.Cols.NumCols:=3 /* 最初の3列のみインポート */ options.Names.AutoNames:=0 /* 自動名前変更はオフ */ options.Names.FNameToBk:=0 /* ブック名をファイル名にしない */ options.Names.FNameToSht:=1 /* シート名をファイル名にする */ options.Names.FNameToShtFrom:=4 /* ファイル名の文字を短縮してを4文字目から表示 */ options.Names.FNameToBkComm:=1 /* ファイル名をブックコメントに追加 */ options.Names.FNameToColComm:=1 /* ファイル名を列コメントに追加 */ options.Names.FPathToComm:=1 /* コメントにファイルパスを含める */ orng:=[bkName$]A1!A[1]:C[0] ;
サンプル 2
このサンプルでは、全サブフォルダおよび先フォルダのsample*.csvという複数のファイルを検索し、各ファイルを新しい行としてOriginのワークシートに追加してインポートします。
newbook test; dlgPath;// ダイアログを開いてメインフォルダを開く type -a "You have choosen " + path$; findfolders addpath:=1; if(folder.GetLength() < 1) { type "No subfolders found"; break 1; } else { int nn = folder.GetNumTokens(CRLF); type "$(nn) subfolders found"; string strTemp$; for(int ii = 1; ii <=nn; ii++) // 検索されたフォルダごとに実行 { strTemp$ = folder.GetToken(ii, CRLF)$; findFiles path:=strTemp$ ext:="sample*.csv" fname:=results; int mm = results.GetNumTokens(CRLF); type "A Total of $(mm) files found"; impasc fname:=results$ menu:=2 options.Impmode:=2 Options.Hdr.SNames:= 4; } }
次のサンプルでは、最初にダイアログを開き、ワークシートにインポートするASCIIファイルを選択します。次に、ワークシートを行列に直接変換し、行列のXY座標を設定します。この変換オプションでは、線形に増加するYが1列目に、線形に増加するXが1行目にあるとしています。
(Samples\Import and Export\にある'matrix_data_with_xy.txt'で試すことができます。)
サンプル:
dlgfile g:=ascii; impAsc; w2m xy:=xcol xlabel:=row1 ycol:=1;
ASCIIファイルおよび単純形式のバイナリファイルのカスタムインポートはインポートウィザードを使って実行することができます。この機能は、ファイル名やヘッダから変数を抽出したり、インポート後に実行するスクリプトを記述してデータの前処理を行うことなどが可能です。このGUIで設定した内容は、拡張子.OIFのインポートフィルタファイルとして様々な場所に保存できます。このようなファイルは拡張子.OIF を持ち、複数の場所に保存できます。
インポートフィルタを作成すれば、Xファンクションimpfileでフィルタを指定し、保存された設定を使用してインポートを実行できます。
サンプル:
string fname$, path$, filtername$; // ファイルパスを指定 path$ = system.path.program$ + "Samples\Import and Export\"; findfiles ext:="S*.dat"; // 条件に一致するファイルを探す // インポートフィルタファイルを指定 filtername$ = system.path.program$ + "Samples\Import and Export\ VarsFromFileNameAndheader.oif"; impfile location:=data; // フィルタを使用してすべてのファイルをインポート
このサンプルでは、フィルタを使用して一連のデータファイルをインポートします。それぞれのデータファイルのために、プロジェクト内に新しいサブフォルダが作成されます。
// データファイルの場所を指定 string path$ = system.path.program$ + "Samples\Signal Processing\"; // ワイルドカードですべてのファイルを検索 findfiles ext:="TR*.dat"; int numFiles = fname.GetNumTokens(LF); // 全てのファイルでループ int nFirst = 1; for(int ifile = 1; ifile <= numFiles; ifile++) { string filepath$, filename$; // 次のファイル名を取得 filepath$=fname.gettoken(ifile,LF)$; // パスと拡張子を除いてファイル名を変数に保持 filename$ = filepath.GetFileName(1)$; // ファイル名で新しいサブフォルダを作成し、アクティブにする pe_mkdir filename$ cd:=1; // 新しいブックを作成してデータファイルをインポート // データフォルダ内にあるフィルタを使用 // このフィルタは、データの前処理として // frequency列を作成し、値を設定 newbook; // Xファンクションの引数名は固有であれば短縮可能 impfile fn:=filepath$ fi:="TR Data Files.oif" l:=0; // PEのフォルダを前のレベルに戻して、次のファイルへ pe_cd ..; }
次のサンプルでは、フィルタを使用して単一または複数ファイルをインポートします。このフィルタは、
各ファイルを新しいシートまたは新しいブックにインポートするか決定する設定があります。このコードを実行する前に、
フィルタを作成してインポートするデータと同じ場所に保存する必要があります。その後、わずか2行のコードでデータを
取り込みます。このコードでは、dlgFile と impFileの2つのXファンクションを使用します。
// ダイアログを開いて単一または複数ファイルを選択 dlgfile group:=*.csv multi:=1; // フィルタファイルmyFilter.oifはデータと同じ場所にある impFile filtername:=myFilter.oif location:=data;
Xファンクションweb2fileは、インターネット上のテキストファイルを取得できます。
このサンプルでは、httpを使用したインターネット上のファイルをユーザファイルフォルダにダウンロードして、アクティブシートにインポートします。
// ローカルにファイルをコピー string fname$="%Y_tmp_webdata.txt"; string url$="http://hadobs.metoffice.com/hadcrut3/diagnostics/global/nh+sh/annual"; web2file; if( exist(fname$) > 0 ) { impASC; del -f "%(fname$)"; // 完了したらファイルを削除 } else ty "Failed to copy web file to local file.";
次のサンプルでは、OriginLabのWebサイト上にあるのロゴ画像をユーザファイルフォルダにダウンロードし、
行列シートにインポートします。
string fname$="%Y_tmp_logo.png"; string url$="https://www.originlab.com/images/header_logo.png"; web2file; if( exist(fname$) > 0 ) { win -t matrix; impImage; del -f "%(fname$)"; // 完了したらファイルを削除 } else ty "Failed to copy web file to local file.";
Samplesフォルダには、Accessデータベースのサンプルstars.mdbが含まれています。以下のコードはこれを使用して、データベースアクセスのXファンクションでアクティブワークシートにインポートを実行します。詳細は、XファンクションdbEditを参照してください。
// 接続文字列を構築します。 // クエリビルダダイアログを使用して接続文字列を構築してください。 string strdb$ = system.path.program$ + "Samples\Import and Export\stars.mdb"; string strConn$="Provider=Microsoft.ACE.OLEDB.12.0; Data Source=%(strdb$); User ID=; Password=;"; // SQL string strSQL$="SELECT Stars.Index, Stars.Name, Stars.LightYears, Stars.Magnitude FROM Stars WHERE Stars.LightYears<=100 ORDER BY Stars.Magnitude, Stars.LightYears"; // データベースに接続し、SQLを投入 dbEdit change conn:=strConn$ sql:=strSQL$; // データインポート dbImport; // データベース接続を切断 dbEdit remove;
次のサンプルでは、複数のSPCファイルを個別のワークシートにインポートして、すべてのデータセットから
グラフを作図する方法を紹介します。また、このコードでは、グラフの凡例の編集も行います。
// 開くダイアログを使用 dlgfile m:=1 g:=*.spc; // *.SPCのグループから複数ファイルを指定 int count = fname.GetNumTokens(CRLF); // ファイル数を取得 newbook; // 新しいブック作成 loop(ii,1,count) { string strFile$ = fname.GetToken(ii,CRLF)$; // 次のファイル名 impSPC f:=strFile$; // インポート %N = %H; // 名前を記憶して後で使用 range ss = [%H]$(ii)!; // シートプロパティにアクセスできる // 1列以上の場合最初の列をXとする if(ss.col2.nrows > 0) // 作図 plotxy [%H]$(ii)!2:end p:=200 o:=[<new>]; // 1列の場合Yとする else // 作図 plotxy [%H]$(ii)!1 p:=200 o:=[<new>]; legendupdate u:=0 m:=custom c:="@WS"; // オプションを使って凡例を更新 win -a %N; // ワークブックをアクティブにする if (ii<count) newsheet; // まだファイルがある場合シートを追加 }
必要なOriginのバージョン: 9.0 SR0以降
XファンクションimpFileSelを使ってインポート前にチャネル構造をツリー変数として取得し、このツリー変数を使ってインポートするチャネル名を指定することができます。これは、インポートのXファンクションimppClamp、impMDF、impMatlab、impNITDM、impNIDIAdem、impPrismで動作します。
以下は、pClampデータをインポートする際にチャネルを指定する方法を紹介しています。
newbook; // 文字列変数fnameをセットし、調べるファイルを指定 fname$ = system.path.program$ + "Samples\Import and Export\pClamp\93310C08.DAT" // ファイル構造をLabTalkツリー変数"tt"に入れる impFileSel xfname:=imppClamp trFiles:=tt; // 各チャネルのチャネル名を表示 //tt.=; // 最初のチャネルを除いてファイル構造を変更 // 最初のチャネル名は"ChannelName1" // 値を0に変更してこのチャネルのインポートをブロック // デフォルトの値1はインポートを許可する for(int ii = 1; ii<=2; ii++) { if (ii == 1) continue; tt.Channels.ChannelName$(ii) = 0; } // 93310C08.DAT と 93311C01.DATを含む2つのファイルを選択 folderpath$=system.path.program$ + "Samples\Import and Export\pClamp"; dlgfile group:="9331*C0*.dat" multi:=1 init:=folderpath$; int numFiles = fname.GetNumTokens(LF); // 全ファイルでループ int nFirst = 1; for(int ifile = 1; ifile <= numFiles; ifile++) { string filepath$, filename$; // 次のファイル名を取得 filepath$=fname.gettoken(ifile,LF)$; newbook; // 変更したファイル構造でインポート imppClamp fname:=filepath$ trFiles:=tt; };
ImpImage は、画像形式のファイルをOrigin にインポートします。
これは複数ファイルのインポートが可能です。デフォルトでは、複数の画像ファイルは行列ページの新しいレイヤに追加されます。それぞれの行列レイヤ名はファイル名になります。
サンプル1:
このサンプルは新しい行列ブックに一連の *.TIF画像をインポートします。
newbook mat:=1; string fns, path$=system.path.program$ +"Samples\Image Processing and Analysis\"; findfiles fname:=fns$ ext:="myocyte*.tif"; // findFilesはデフォルトでpath$から取得 int n = fns.GetNumTokens(CRLF); impimage options.Mode:=4 fname:=fns$
サンプル2:
このサンプルは、JPG画像のフォルダを異なる行列ブックにインポートします。
string fns, path$="C:\Documents and Settings\All Users\Documents\My Pictures\Sample Pictures\"; findfiles fname:=fns$ ext:="*.jpg"; // findFilesはデフォルトでpath$から取得 int n = fns.GetNumTokens(CRLF); string bkName$; string fname$; for(int ii = 1; ii<=n; ii++) { fname$ = fns.GetToken(ii, CRLF)$; // 新しい行列ページを作成 newbook s:=0 mat:=1 result:=bkName$; // 行列ページの最初のレイヤに画像をインポート // impimageはデフォルトでfname$をインポート impimage orng:=[bkName$]msheet1; }
ここでは、ビットマップ画像をインポートしてバイト行列に変換する方法を紹介します。
dlgfile g:=*.bmp; // 開くダイアログを開いてファイルを選択し、fname$にいれる newbook m:=1; // 新しい行列ブックを作成 impImage; // アクティブな行列ブックにインポート img2m o:=<input> t:=1; // 画像をバイトデータに変換
このスクリプトはASCIIファイルをノートウィンドウに開きます。winNameを指定しない場合、新しいノートウィンドウが作成されます。
サンプル:
%b = system.path.program$ + "Samples\Import and Export\ASCII simple.dat"; open -n "%b";
必要なOriginのバージョン: 9.1 SR2以降
このサンプルでは、新しい行列ブックを作成して、アクティブシートの複数行列オブジェクトに、指定した動画ファイルのフレームをロードします。
自身のファイルのコードを簡単に修正したり、特定のフレーム数や時間の増分でロードするように指定したりすることができます。
string vfilename$ = "d:\test.avi"; //ByCountを0にするとStepSize秒毎に読み込み //1にすると、TotalFrames数分読み込む int ByCount = 1; int TotalFrames = 100; double StepSize = 15; // 秒 // 新しい行列ブックを作成 string matbk$; newbook mat:=1 result:=matbk$; int skip; // 動画ファイルを開く int err = vr.Open(%(vfilename$)); if( 0 == err ) { if( ByCount ) // スキップして終了までのTotalFrames数分読み込む { skip = vr.FrameCount/TotalFrames; type "Read total of $(TotalFrames) frames, Skip every $(skip) frames or $(skip/vr.FPS) sec. File has $(vr.FrameCount) frames"; } else // 1フレーム読み込んでStepSize秒スキップ { skip = StepSize * vr.FPS; type "Read total of $(TotalFrames) frames, Skip every $(skip) frames or $(StepSize) sec. File has $(vr.FrameCount) frames"; } // 現在の位置(最初)からファイルの // 最後(frameCount=0)まで行列に読み込み vr.ReadFrames(%h, TotalFrames, skip); vr.Close();// 動画ファイルを閉じる } page.cntrl=1; // イメージモード matrix -it 1; // サムネイル表示
このサンプルは、アクティブなワークブックにインポートされたデータを元に戻します。コードを実行する前に、データ:ファイルからインポート:ASCIIメニューを使ってワークブックにデータをインポートします。この時、インポートオプションで、インポートモードを「シートを新たに作って読み込む」に設定してください。その後、ワークシート:ワークシートのクリアメニューで各シートのデータを削除します。以下のスクリプトを実行してください。
loop (i, 1, page.nlayers) { // ブック内のすべてのシートでループ page.active = i; // アクティブシート reimport; // アクティブシートのデータを元に戻すために再インポート }
ここでは、ファイルをインポートしたあと、再インポートのためにファイルの変更を確認します。このスクリプトは特定イベントマクロtimerprocを使い、指定した間隔で実行します。
// データをインポートして作図 string fname$ = D:\Sample.dat; impasc; range raIn = !; // 再インポート用 plotxy (1,2) 202; double olddate = exist(%(fname$),5); // ファイルの日付-時間をメモ // ここから、ファイル変更があったら再インポートするマクロをプログラム def timerproc { double newdate = exist(%(fname$),5); // 現在のファイルの日付-時間 if(newdate != olddate) { reimport or:=raIn; // ファイルに変更があったら再インポート olddate = newdate; layer -a; // グラフを更新(グラフウィンドウがアクティブなことが前提) } else ty Nothing new ...; // 必要なければこの行は削除 } // ファイルを確認するタイマーを開始 timer 1800; // timerprocを1800秒(30分)ごとに実行
プロセスを停止するために以下のコマンドを実行する必要があります。
timer -k;