インポート
複数ASCIIファイルインポートや部分インポート、画像ファイルのインポート、インポートフィルタを使ったインポートなどをLabTalkスクリプトで実行します。
- Xファンクションを使ってデータをインポート
- ASCIIインポート
- インポートフィルタ
- インターネットデータへのアクセス
- データベースへのアクセス
- 機器データのインポート
- インポートするチャネル名を指定
- 画像ファイル
- テキストファイル
- 動画のインポート
- 再インポート
Xファンクションを使ってデータをインポート
Originには、ASCII、CSV、Excel、National Instruments DIAdem、pCLAMPなど様々なデータファイルをインポートするためのXファンクションがあります。各ファイルフォーマットごとのオプション設定のほか、インポートファイルの名前をブックやシート名にするといった共通の設定が可能です。
インポートに関するXファンクション名は、すべてimpから始まります。
また、ユーザ独自のインポートルーチンをXファンクションとして作成できます。作成したXファンクションの名前をimpから始まるものにし、Originインストールフォルダやユーザファイルフォルダ、グループパスの\X-Functions\Import and Exportサブフォルダに置けば、ファイル|インポートメニューに表示できます。
インポートの機能と、システムブラウザの機能(dlgfileやfindfiles)には、共通のパラメータfnameがあります。fnameは、ファイル名のみまたは、ファイルのパスやリストを保持できる文字列変数です。インポートのXファンクションは、複数ファイルを扱えます。複数ファイルをどう扱うか、つまり、追加ファイルのために新しいブックを作成するのかあるいは、シートや列を作成するのかについてのデフォルト設定はXファンクションごとに異なります。これはオプションによって変更可能です。
Xファンクションテーマ
GUIからインポートのXファンクションを使用するとき、カスタマイズした設定をテーマとして保存できます。テーマファイルは、拡張子.OISのファイルとしてユーザファイルフォルダの\Themes\AnalysisAndReportTableに保存されます。関連するXファンクションの-tオプションスイッチを使用して、保存したテーマファイルにアクセスでき、テーマに保存された設定を使用したインポートが可能です。
string fn$=system.path.program$ + "Samples\Spectroscopy\HiddenPeaks.dat"; // テーマファイル "My Theme.OIS" を使う impasc fname:=fn$ -t "My Theme";
ASCIIインポート
ヘッダとロングネームのコントロール
アメリカの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);// ロングネームとコメントを表示 wrowheight [C:C] 17; //コメントの内容表示するためにコメント行を17行に設定
部分インポート
XファンクションimpASCのオプションツリーは、名前のオプションや部分インポートのオプションを設定できます。例えば、ダイアログを使用して複数のファイルを指定し、各ファイルの一部(10行)をインポートして列3データの検定を実行します。データが基準を満たせばすべてのファイルをインポートし、そうでない場合スキップします。
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; } }
区切り文字および数値の区切り
impASCのオプションツリーは、区切り文字と数値の区切りオプションを設定できます。これら2つのオプションは、オプションツリーのFileStructノードにあります。
以下が区切り文字のオプション(options.FileStruct.Delimiter)です。
- 0 = 不明
- 1 = コンマ
- 2 = タブ
- 3 = タブ/スペース
- 4 = セミコロン
- 5 = その他(options.FileStruct.OtherDelimiterで文字を指定)
- 7 = スペース
以下が数値の区切り文字のオプション(options.FileStruct.NumericSeparator)です。
- 0 = 1,000.00
- 1 = 1.000,00
- 2 = 1 000,00
- 3 = 1'000.00
次のデータは単純な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;
インポートモード
このサンプルでは、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; /* 先行ゼロを削除 */
複数ファイルのインポート
次のサンプルでは、複数データファイルを新しいワークブックにインポートして各ファイルごとに新しいシートを作成します。
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] ;
インポート後にワークシートを行列に変換
次のサンプルでは、最初にダイアログを開き、ワークシートにインポートする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のインポートフィルタファイルとして様々な場所に保存できます。
インポートフィルタを作成すれば、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; // フィルタを使用してすべてのファイルをインポート
サンプルフィルタを使用してXファンクションimpFileを実行
このサンプルでは、フィルタを使用して一連のデータファイルをインポートします。それぞれのデータファイルのために、プロジェクト内に新しいサブフォルダが作成されます。
// データファイルの場所を指定 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 ..; }
次のサンプルでは、フィルタを使用して単一または複数ファイルをインポートします。このフィルタは、各ファイルを新しいシートまたは新しいブックにインポートするか決定する設定があります。このコードを実行する前に、フィルタを作成してインポートするデータと同じ場所に保存する必要があります。このコードでは、dlgFile と impFileの2つのXファンクションを使用します。
// ダイアログを開いて単一または複数ファイルを選択 dlgfile group:=*.csv multi:=1; // フィルタファイルmyFilter.oifはデータと同じ場所にある impFile filtername:=myFilter.oif location:=data;
インターネットデータへのアクセス
Xファンクションweb2fileは、インターネット上のテキストファイルを取得できます。
Web上のASCIIファイルをワークシートにインポート
このサンプルでは、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.";
Web上の画像を新しい行列にインポート
次のサンプルでは、OriginLabのWebサイト上にあるのロゴ画像をユーザファイルフォルダにダウンロードし、行列シートのインポートします。
string fname$="%Y_tmp_logo.png"; string url$="http://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.";
データベースへのアクセス
Accessデータベースからインポート
Samplesフォルダには、Accessデータベースのサンプルstars.mdbが含まれています。以下のコードはこれを使用して、データベースアクセスのXファンクションでアクティブワークシートにインポートを実行します。なお、このコードは32bit版Originでしか動作しません。64bit版Originの場合、Windowsから64bit Jet OLEDBプロバイダが提供されていないため、動作しません。
// 接続文字列を構築します。 // クエリビルダダイアログを使用して接続文字列を構築してください。 string strdb$ = system.path.program$ + "Samples\Import and Export\stars.mdb"; string strConn$="Provider=Microsoft.Jet.OLEDB.4.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ファイルのインポートと作図
次のサンプルでは、複数の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\2CHTAPE.DAT"; // ファイル構造をLabTalkツリー変数"tt"に入れる impFileSel xfname:=imppClamp trFiles:=tt; // 各チャネルのチャネル名を表示 tt.=; // 最初のチャネルを除いてファイル構造を変更 // 最初のチャネル名は"ChannelName1" // 値を0に変更してこのチャネルのインポートをブロック // デフォルトの値1はインポートを許可する tt.Channels.ChannelName1 = 0; // 修正されたファイル構造でインポート imppClamp trFiles:=tt;
画像ファイル
画像をインポート
ImpImageはOriginに画像ファイルをインポートします。
これは複数ファイルのインポートが可能です。デフォルトでは、複数の画像ファイルは行列ページの新しいレイヤに追加されます。それぞれの行列レイヤ名はファイル名になります。
次のサンプルでは、一連の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$
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; // 画像をバイトデータに変換
テキストファイル
テキストファイルをノートウィンドウに開く
open -n fileName [winName]
このスクリプトはテキストファイルをノートウィンドウに開きます。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;
その他のスクリプトサンプル