Microsoft Excelファイルやテキストファイルなどの一般的な形式のファイルは、JMPに読み込む際、データテーブル形式に変換されます。Windowsでは、ファイル拡張子に従ってファイルの種類とファイル内容の解釈方法が特定されます。次に、JMPによって識別されるファイル拡張子の例を挙げます。
Open( "$SAMPLE_IMPORT_DATA/Bigclass.xlsx" ); // Microsoft Excelファイル
Open( "$SAMPLE_IMPORT_DATA/Bigclass.txt" ); // テキストファイル
Open( "$SAMPLE_IMPORT_DATA/Carpoll.xpt" ); // SAS移送ファイル
macOS上では、macOSのタイプおよびクリエータのコード(もしあれば)に基づいて解釈し、2次的に3文字のファイル名拡張子を使います。ファイルをmacOSに読み込む場合は、あらかじめファイル拡張子を追加することを忘れないでください。
• タイプおよびクリエータコードは、Finderが作成元のアプリケーションに対応する正しいアイコンでファイルを表示できるようにするための情報です。
• 一般アイコン(他のシステムから取得したファイルに表示されているもの)で表示されるファイルにはファイル名拡張子が付いています。
Open( "$SAMPLE_IMPORT_DATA/Bigclass.txt", text );
その他に使えるフォーマットには、.csv、.jsl、.dat、.tsv、および.jrnがあります。
読み込みオプションの詳細については、『スクリプト構文リファレンス』のファイル関数を参照してください。
[複数のファイルの読み込み](Multiple File Import: MFI)ウィンドウのスクリプトをスクリプトウィンドウに保存すると、デフォルトのままのものも、そうでないものも、すべてのパラメータを含むスクリプトが生成されます。生成されたスクリプトを以下のように減らすことができます。
mfi = Multiple File Import(
<<Set Folder( "$SAMPLE_IMPORT_DATA" ),
<<Set Name Filter( "UN*.csv" ), // このファイル名をもつファイルを読み込む
<<Set Name Enable( 1 ),
<<Set Add File Name Column( 1 ) // ファイル名の列を追加する
)
<<Import Data();
以下の式におけるわずかな違いに留意してください。
mfi = Multiple File Import();
mfiは[複数のファイルの読み込み](MFI)オブジェクトを含みます。
dtlist = Multiple File Import(…) << Import Data;
dtlistは Import DataメッセージをMFIオブジェクトに送ることで作られるファイルのリストを含みます。MFIオブジェクトは、変数あるいはウィンドウに格納されなかったため、なくなっています。MFIオブジェクトを保存するにはCreate Windowを送る、またはmfiのような変数に保存して、Import Dataなどのメッセージをその変数に送るといった方法があります。Import DataをMFIオブジェクトに送ると、必ずリストが戻され、レポート作成などのタスクでその項目を使用することになります。
Create Windowはデバッグに役立ちます。ウィンドウが表示されさらにMFIオブジェクトも使用できます。以下のラインを1行ずつ実行して、結果を確認してください。
mfi = Multiple File Import();
mfi <<Create Window;
mfi <<Set Folder( "$DESKTOP" );
以下は、コールバック関数を使い、「複数ファイルの読み込み」ウィンドウの[読み込み]ボタンがクリックされたときに読み込まれたファイルのリストを取得する例です。
Delete Directory( "$TEMP/test" );
Create Directory( "$TEMP/test" );
Save Text File( "$TEMP/test/argylesocks1.txt", "a1\!n1" ); // データを
Save Text File( "$TEMP/test/argylesocks2.txt", "a2\!n1" ); // 作成する
global:importedFiles={};
mfi = Multiple File Import( // MFIオブジェクトを作成する
<<Set Folder( "$TEMP/test/" ),
<<Set Name Filter( "argylesocks?.txt;" ),
<<Set Name Enable( 1 ),
<<Set Add File Name Column( 1 ),
<<Set Import Callback(
Function( {this, files}, // コールバック関数
global:importedFiles = files;
/* オプション: Close Windowを省いて「複数ファイルの読み込み」ウィンドウを開いたままにし、
ユーザが設定を変更できるようにする。*/
win << Close Window;
)
)
);
win = mfi << Create Window; // ウィンドウを開く
While(
Try(
win << Parent;
1;
,
0
),
Wait( 1 )
); // ダイアログが閉じるまで待機
Show( global:importedFiles ); // proceed
メモ:
• MFIの詳細は、『JMPの使用法』の複数ファイルの読み込みを参照してください。
• MFIを用いたWebページからデータテーブルへのイメージの読み込みについての詳細は、ディレクトリからのイメージの読み込みを参照してください。
PDFファイルに、データを含んだテーブル(表)がある場合、JMPはこれらのテーブルを自動的に検出し、行や列の構造を特定します。
ユーザは、各ページの各テーブルの範囲、列見出しの数、テーブルを連結するかどうか、などをスクリプトで指定できます。
メモ: PDFファイルは、データを含むテーブルで構成されています。PDF読み込みウィザードのPDFプレビューでは、テーブルが枠で囲んで選択されます。
PDFファイルを読み込むオプションには、以下のものがあります。
Open( "PDF file path" ),
Tables(
Table( "data table name",
Add Rows( Header Rows( number ),
(Rect( left, right, top, bottom ),
Page( number ), Row Borders(), Column Borders())) |
Tables( Combine( All | Matching Headers | None),
Minimum Rows( number ), Minimum Columns(#))))
| PDF wizard );
ここでは、複数のテーブルを読み込んで連結し、1つのデータテーブルにする方法をご紹介します。作成したスクリプトは、最終的なデータテーブルの「ソース」変数に保存され、いつでも実行することができます。この例で使用するのは、Figure 9.1にある「Food Distribution.pdf」というサンプルファイルで、各ページに1つのテーブルを含んでいます。
図9.1 PDFファイルの最初の状態
Open(
"$SAMPLE_IMPORT_DATA/Food Distribution.pdf",
PDF Tables(
Table( // テーブルを1つのテーブルに読み込む
Table Name( "Food Distribution" ), // データテーブル名
Add Rows( // ページ1の行
Header Rows( 7 ), // 見出し行の数
Page( 1 ),
Rect( 0.6922, 0.7155, 7.2842, 10.1124 ) // テーブルのサイズ
), // ページ2の指定
Add Rows( Page( 2 ), Rect( 0.6922, 0.7156, 7.2842, 10.0708 ) )
)
)
);
ヒント: いったんPDFファイルをPDF読み込みウィザードで読み込み、「ソース」変数のスクリプトをコピーして別のスクリプトの中に貼り付けてください。この方法なら、Rectの設定を推測する必要がなく、すばやく設定を取得できます。
以下の構文は、PDFファイルのテーブルを別々のデータテーブルに保存するものです。結果として読み込まれたデータテーブルのそれぞれが、下のような「ソース」スクリプトを含んでいます。
Open(
"PDF file path",
PDF Tables(
Table(
Table Name( "data table name" ),
Add Rows( Page( number ), Rect( left, right, top, bottom ) )
)
)
);
以下の例は、各ページの列名が一致している場合にデータを連結する方法を示します。
図9.2 各ページの列見出しが一致しているデータ
pdftable = Open(
"$SAMPLE_IMPORT_DATA/Iris.pdf",
PDF All Tables( Combine( Matching Headers ) )
);
図9.3 最終的なデータテーブル
PDFファイルの1つのページに、複数の列に分かれたデータが含まれていることがあります。Figure 9.4は、「Groundhog Day Predictions.pdf」という名前のサンプルファイルで、各ページに複数のテーブルを含んでいます。
図9.4 複数の列を含んだページ
以下のスクリプトは、すべての列を1つのデータテーブルに読み込みます。
Open(
"$SAMPLE_IMPORT_DATA/Groundhog Day Predictions.pdf",
PDF Tables(
Table(
Table Name( "Groundhog Day Predictions" ),
// ページ1の仕様
Add Rows( Page( 1 ), Rect( 0.9726, 1.4325, 3.0351, 9.9974 ) ),
Add Rows( Page( 1 ), Rect( 3.3063, 1.4325, 5.3688, 9.9608 ) ),
Add Rows( Page( 1 ), Rect( 5.6399, 1.4325, 7.7025, 8.7925 ) ),
// ページ2の仕様
Add Rows( Page( 2 ), Rect( 0.9726, 1.4325, 3.0351, 9.9441 ) ),
Add Rows( Page( 2 ), Rect( 3.3063, 1.4325, 5.3688, 9.9274 ) ),
Add Rows( Page( 2 ), Rect( 5.6399, 1.4325, 7.7025, 8.8225 ) ),
// ページ3の仕様
Add Rows( Page( 3 ), Rect( 0.9726, 1.4325, 3.0351, 7.6404 ) ),
Add Rows( Page( 3 ), Rect( 3.3063, 1.4325, 5.3688, 7.1254 ) ),
Add Rows( Page( 3 ), Rect( 5.6399, 1.4325, 7.7025, 7.4721 ) )
)
)
);
図9.5 最終的なデータテーブル
PDFファイルのデータをテキスト文字列に取り出すことができます。これは、データからパターンを抽出したい場合に効果的な方法です。
以下は、「Iris.pdf」サンプルデータからすべてのテキストを読み込む基本的な例です。
Open( "$SAMPLE_IMPORT_DATA/Iris.pdf", PDF text );
以下のスクリプトは、「Figure」という語の後にスペース、数字、ピリオド、数字が続くケースを検索し、ログに出力します。
txt = Open( "$JMP_HOME/Documentation/JMP Documentation Library.pdf", PDFText() );
figures = {};
For( page = 1, page < N Items( txt ), page++,
// 文字列を検索する
next = Regex Match( txt[page], "Figure\s+\d+\.\d+", "" );
While( N Items( next ) > 0,
figures = Insert( figures, next );
// 文字列を抽出する
next = Regex Match( txt[page], "Figure\s+\d+\.\d+", "" );
);
);
Print( figures );
{"Figure 2.1", "Figure 2.2", "Figure 2.3", "Figure 2.4", "Figure 2.4", "Figure 2.4", "Figure 2.4", "Figure 2.5", "Figure 2.6", "Figure 2.7", "Figure 2.8", "Figure 2.9", "Figure 2.10", "Figure 2.10", ...}
[テキストデータファイル]の環境設定にある[読み込みの設定]では、テキストファイルの読み込み方法を指定します。たとえば、1行目を列名、2行目以降をデータとするのがデフォルトの設定です。別の設定を使用するには、Open()のオプションとして読み込みの設定を記述します。
デフォルトの読み込みの設定と独自の設定は、データテーブルの「ソース」スクリプトに保存されるため、データを同じ設定で再度読み込むことができます。ただし、このスクリプトでは、デフォルトの読み込みの設定はオプションです。
Open()には、次のようなオプションがあります。
/* Charset options: "Best Guess", "utf-8", "utf-16", "us-ascii", "windows-1252", "x-max-roman", "x-mac-japanese", "shift-jis", "euc-jp", "utf-16be", "gb2312" */
CharSet("option")
Number of Columns(Number)
/* colType is Character|Numeric
colWidth is an integer specifying the width of the column */
Columns(colName=colType(colWidth),... )
Treat Empty Columns as Numeric(Boolean)
Scan Whole File(Boolean)
End Of Field(Tab|Space|Comma|Semicolon|Other|None)
EOF Other("char")
End Of Line(CRLF|CR|LF|Semicolon|Other)
EOL Other("Char")
Strip Quotes|Strip Enclosing Quotes(Boolean)
Labels | Table Contains Column Headers(Boolean)
Year Rule | Two digit year rule ("Decade Start")
Column Names Start | Column Names are on line(Number)
Data Starts | Data Starts on Line(Number)
Lines to Read(Number)
Use Apostrophe as Quotation Mark
CompressNumericColumns(Boolean)
CompressCharacterColumns(Boolean)
CompressAllowListCheck(Boolean)
次のスクリプトは、テキストがカンマで区切られているテキストファイルを開きます。このファイルには、列名は含まれていません。このスクリプトで、列名と列の幅を定義します。
Open(
"$SAMPLE_IMPORT_DATA/EOF_comma.txt",
End of Field( comma ),
Labels( 0 ),
Columns(
name = Character( 12 ),
age = Numeric( 5 ),
sex = Character( 5 ),
height = Numeric( 3 ),
weight = Numeric( 3 )
)
);
次の例では、フィールドの区切りにスペースが使われていて、列名を含まないテキストファイルを開きます。
Open(
"$SAMPLE_IMPORT_DATA/EOF_space.txt",
Labels( 0 ),
End of Field( Space )
);
前述の、フィールド区切り文字にスペースを用いたテキストファイルの場合は、次のように指定してJMPに形式を識別させれば、ラベルや区切り文字を指定しなくても読み込めます。
Open(
"$SAMPLE_IMPORT_DATA/EOF_space.txt",
Import Settings( Guess File Format() )
);
読み込みオプションを対話式に設定するには、Text Wizard引数を指定します。テキスト読み込みウィンドウにテキストファイルのプレビューが開きます。
Open( "$SAMPLE_IMPORT_DATA/EOF_space.txt", "Text Wizard" );
以下の節で、各引数について詳しく説明します。読み込みオプションの詳細については、『スクリプト構文リファレンス』のファイル関数を参照してください。
ソースファイルの合計列数を指定します。データが明確に区切られていない場合に重要です。
これまでの例にあったように、Columns引数を使って列名、列の種類、列の幅を指定します。
ファイルの2列目以降に対して設定を行う場合は、それより前にある列もすべて設定する必要があります。たとえば、「名前」、「性別」、「年齢」、「ID」という4つの列がこの順番にあるテキストファイルを開きたいとします。「年齢」は数値列で、幅を5に設定します。その場合は、「名前」と「性別」の列についても種類と幅を設定し、同じ順番でリストする必要があります。
Columns(
名前 = Character( 15 ),
性別 = Character( 5 ),
年齢 = Numeric( 5 )
);
後続の列(この例では「ID」)に対しては、設定を行う必要はありません。
データが読み込まれたら、列の尺度を使用します。データと尺度の設定または取得を参照してください。
メモ: 次の引数のほとんどは、JMPの環境設定で定義されています。環境設定を上書きしたいときは、次のうちで該当する引数を、読み込みスクリプトの中に含めます。
欠測データの列を、文字データではなく数値として読み込みます。欠測値を示すフラグとして、ピリオド、Unicodeのドット、NaN、または空白文字列を使用できます。これはブール値です。デフォルト値は0(偽)。
列のデータタイプを特定する目的でJMPがどれくらいファイルをスキャンするかを指定します。これはブール値です。デフォルトの値は真で、データの種類が特定できるまでファイル全体をスキャンします。大きいファイルを読み込むときは、値を偽に設定すると、ファイルが5秒間だけスキャンされます。
文字列の値を囲む二重引用符(")を含めるか、削除するかを指定します。これはブール値です。デフォルト値は、1(真)。
たとえば、フィールドがスペースで区切られているとします。
• 「John Doe」は2つの文字列と解釈されます(「John」と「Doe」)。
• 「"John Doe"」は1つの文字列と解釈されます。JMPを始めとする多くのプログラムは、引用符は読みますが、2つ目の引用符が現れるまでにある他の区切り文字は無視します。
• Strip Quotes(1)を含めると、「"John Doe"」は「John Doe」(引用符のない1つの文字列)として解釈されます。
ワードプロセッサには、二重引用符文字(")を自動的に左右の(“ ”)に変換するものがあります。テキストファイルの読み込み時にJMPによって二重引用符が取り除かれる場合でも、この形式の二重引用符はそのまま文字として解釈されます。
行を区切る文字を指定します。
• CR(復帰文字) macOSで作成されたテキストファイルで標準的に使用されている区切り文字。
• LF(改行) UNIXとmacOS Xのテキストファイルで標準的に使用されている区切り文字。
• CRLF(復帰文字と改行の両方) Windowsのテキストファイルで標準的に使用されている区切り文字。
この3つの文字が、デフォルトで行の区切り文字として設定されています。
行の区切り文字を別の文字にするには、その他(Other)オプションを使用し、EOLOther引数を使って具体的に文字を指定します。JMPは、この文字とデフォルトの文字のいずれかを行の区切り文字と解釈します。
フィールドの区切りに使われる文字を指定します。
メモ:
• デフォルトのフィールド区切り文字はタブ(Tab)です。
• フィールドの区切り文字を別の文字にするには、その他(Other)オプションを使用し、EOFOther引数を使って具体的に文字を指定します。
• Spaceオプションは1つのスペースを区切り文字として使用し、
• Spacesオプションは複数のスペースを区切り文字として使用します。
フィールドまたは行の区切り文字を指定します。たとえば、EOLOther("*")は、テキストファイル内の行がアスタリスク(*)で区切られていることを示します。
テキストファイルの最初の行が、列名として使用されているかどうかを指定します。これはブール値です。デフォルト値は、1(真)。
2桁の年の値の読み込み方を指定します。最も早い日付が1979年の場合は、「1970」と指定します。最も早い日付が2001年の場合は、「20xx」と指定します。
列名の開始行を指定します。次の例では、テキストファイルの列名が第3行から始まることを指定します。
Open(
"$SAMPLE_IMPORT_DATA/Animals_line3.txt",
Columns(
Column( "species", Character, "Nominal" ),
Column( "subject", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "miles", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "season", Character, "Nominal" )
),
Column Names Start( 3 )
);
データの開始行を指定します。
次の例は、テキストファイルのデータが第5行から始まることを指定します。
Open(
"$SAMPLE_IMPORT_DATA/Bigclass_L.txt",
Columns(
Column( "name", Character, "Nominal" ),
Column( "age", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "sex", Character, "Nominal" ),
Column( "height", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "weight", Numeric, "Continuous", Format( "Best", 10 ) )
),
Data Starts( 5 )
);
データテーブルに含める行の数を指定します。JMPは、列名が読み込まれた後でカウントを開始します。
次の例は、最初の10行だけをデータテーブルに含めます。
Open(
"$SAMPLE_IMPORT_DATA/Bigclass_L.txt",
Columns(
Column( "name", Character, "Nominal"),
Column( "age", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "sex", Character, "Nominal" ),
Column( "height", Numeric, "Continuous", Format( "Best", 10 ) ),
Column( "weight", Numeric, "Continuous", Format( "Best", 10 ) )
),
Lines To Read( 10 )
);
アポストロフィで囲まれているデータの場合に、アポストロフィを引用符として扱い、省略します。たとえば、「’2010’」は「2010」として読み込まれます。これはブール値です。デフォルト値は偽です。
テキストデータが標準的な形式ではなく、フィールドが引用符ではなくアポストロフィで囲まれている場合以外、このオプションは推奨されません。
テキストを読み込むための環境設定を指定したい場合は、最初にすべての環境設定のリストを見ることができると便利です。そのためにはShow Preferences (All)関数を使用します。
その後、必要なセクションだけをコピーしてPreferences関数の中に貼り付けます。たとえば、読み込み設定を指定する場合の式は次のようになります。
Preferences(
Import Settings(
End Of Field( Tab, Spaces, Comma )
)
);
JMPでExcelブックを開くと、自動的にデータテーブルに変換されます。JMPは、.xls、.xlsm、.xlsx 形式のファイルに対応しています。Microsoft Excelのサポートの詳細については、『JMPの使用法』のMicrosoft Excelファイルの読み込みを参照してください。
JMPの環境設定では、[サードパーティのデータ]にワークシートの読み込みに関する設定があります。
Excelファイルを開く方法
標準のOpenステートメントを使ってMicrosoft Excelファイルを開く際の、デフォルトの方法です。
Excelウィザードを使用
ファイルの読み込み時にExcel読み込みウィザードが開きます。これがデフォルトの設定です。
すべてのシートを開く
Microsoft Excelファイルに含まれるすべてのシートが開きます。
個々のExcelシートを選択
ユーザがファイルを開く際、1つまたは複数のワークシートを選択するよう促されます。
Excelのラベルを列名として使用
ワークシートの最初の行にあるテキストを、データテーブルの列名に変換するかどうかを指定します。
デフォルトでは、自動識別が行われます。最初の行のすべてのセルに名前が定義されている場合は、それらのセル内のテキストが列名に変換されます。名前が定義されていないセルがある場合は、「列1」、「列2」・・・という列名が使用されます。
環境設定を無視するには、この節で後述している、対応する引数を含めます。
メモ: データテーブルをExcelワークシートに書き出す方法については、Excelワークブックの作成を参照してください。
Open()関数を引数なしで使用してExcelファイルを開くと、状況に応じて異なった動作となります。
• Open()関数がスクリプトの一部として直接実行される場合、Excel ファイルはユーザが指定したExcel読み込みの環境設定を使用して、データテーブル内に表示されます。次の例は、ウィザードを使用せずに、両ワークシートをデータテーブル内に開きます。
Path = Convert File Path( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", absolute );
dt = Open( Path );
メモ: Excel Wizardを使うには、引数に[Excel Wizard]オプションを指定しなければなりません。Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", "Excel Wizard" );.
• ただし、Open()関数がボタンをクリックすることによって実行されるスクリプトの一部である場合、プレビューウィンドウが開き、ユーザはそれを操作する必要があります。次の例を実行し、ボタンをクリックして、Excel読み込みウィザードを確認してみましょう。
Path = Convert File Path( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", absolute );
New Window( "button", Button Box( "Open", dt = Open( Path ) ) );
• このスクリプトにより、Excel ファイルを読み込むためのプレビューウィンドウが開かないようにするには、Open()関数に引数を追加します。例を実行し、ボタンをクリックします。2つのワークシートが、Excel読み込みウィザードを介さずにデータテーブル内に開きます。
Path = Convert File Path( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", absolute );
New Window( "button", Button Box( "Open", dt = Open( Path, Use for all sheets(1) ) ) );
このほか、環境設定のExcel Open Methodを使って、すべてのシートを開くよう指定することもできます。
Preference( Excel Open Method( "Open All Sheets" ) );
Path = Convert File Path( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", absolute );
New Window( "button", Button Box( "Open", dt = Open( Path ) ) );
Excel読み込みウィザードでは、データを読み込む前にデータのプレビューを表示し、設定に変更を加えることができます。次のように、引数として"Excel Wizard"を指定します。
dt = Open( "$SAMPLE_IMPORT_DATA/Team Results.xlsx", Excel Wizard );
列見出しの行数などの設定をカスタマイズすることができます。
Open(
"$SAMPLE_IMPORT_DATA/Team Results.xlsx",
Worksheets( "Grouped Team Results" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
// Team Resultsの構造に従ってカスタマイズ
Headers Start on Row( 3 )
)
);
スクリプトで作成した独自のボタンをクリックしてワークブックを開くと、[Excel ファイルを開く方法]の環境設定が適用されます。ワークシートを直接開くようにするには、次のようにスクリプト内にExcel Open Methodを指定します。
Preference( Excel Open Method( "Open All Sheets" ) );
ブックにある特定のワークシートからデータを読み込みたいとしましょう。その場合は、Worksheetsという引数を使ってワークシートを指定します。次の例は、「小」という名前のワークシートを読み込みます。
Open( "C:\My Data\cars.xlsx", Worksheets( "小" ) );
または、ワークシートの番号を指定します。この例では、3番目のワークシートを読み込みます。
Open( "C:\My Data\cars.xlsx", Worksheets( "3" ) );
複数またはすべてのワークシートを読み込む場合は、リストの形でワークシート名を指定します。
Open( "C:\My Data\cars.xlsx", Worksheets( {"小", "中", "大"} ) );
XML読み込みウィザードでは、XMLファイルやJSONファイルを読み込むことができます。これらのファイルでは、テキストデータが入れ子状になっています。どちらの種類のファイルも、テキストが階層状(入れ子状)に保存されており、それらの階層関係を表す構造化テキストを含んでいます。ウィザードでは、階層の中で値を含んでいる要素と、データテーブルを構成する行を特定する要素を読み込むことができます。
階層状のテキストファイルがどのようなものかを理解するには、短編小説をまとめた本を思い浮かべるとよいでしょう。短編小説の中には、章で構成されるものもあれば、段落しかないものもあります。章は、複数の段落で構成されます。段落は、複数の文で構成されます。以下の例は、そのような本の完全なツリーを示しています。JMPのSamples¥Import DataディレクトリにBook.xmlとして保存されています。
<book>
<story name="car poll">
<wheels>4</wheels>
<para><name>chev</name></para>
<para><name>ford</name></para>
<para><name>volk</name></para>
</story>
<story name="big class">
<para><name>ralph</name><height>6</height></para>
<para><name>billy</name><height>5</height></para>
</story>
<story name="cheese" location="NC">
<chapter name="american">
<para>1<price>2.00</price><quantity>2</quantity></para>
<para>2<price>2.10</price><quantity>4</quantity></para>
<para>3<price>2.20</price><quantity>3</quantity></para>
</chapter>
<chapter name="swiss">
<para>1<price>3.00</price><quantity>3</quantity></para>
<para>2<price>3.10</price><quantity>2</quantity></para>
</chapter>
</story>
</book>
このXMLドキュメント(本)は、3つの短編から成ります。短編はそれぞれが異なるデータテーブルとなります。このXMLファイルでは、段落がデータテーブルの行になります。これは必須ではなく、ここで使用している名前も特に意味があるわけではありません。チーズのテーブルを読み込みたい場合、他の2つのテーブルに比べて多少複雑なので、各行を「アメリカ産」と「スイス産」という値で分類する「種類」列を加えるといいでしょう。価格(price)や数量(quantity)の列もあります。それから、<para>の1、2、3、1、2という値に対して名前を明確に定義しない列を作成します。行の数は5になります。最後に、場所を表すNCという値を持つテーブル変数または列を作成します。
次の例は、上記のデータをデータテーブルに読み込む方法を示しています。
Open(
"$SAMPLE_IMPORT_DATA/Book.xml",
XML Settings(
Row( "/book/story/chapter/para" ),
// <para>の値ごとに1つの行を作成する
Col(
"/book/story/@location",
// locationの属性の列を作成する
Column Name( "location" ),
// 列の名前を変更する
Fill( "Use Forever" ),
// 空白のセルに1つ前の値を入力する
Type( "Character" ), // データタイプ
Format( "best" ) // 列の形式
),
Col(
"/book/story/chapter/@name",
Column Name( "variety" ),
Fill( "Use Once" ),
Type( "Character" ),
Format( "best" )
),
Col(
"/book/story/chapter/para",
Column Name( "interesting" ),
Fill( "Use Once" ),
Type( "Numeric" ),
Format( "best" )
),
Col(
"/book/story/chapter/para/price",
Column Name( "price" ),
Fill( "Use Once" ),
Type( "Character" ),
Format( "best" )
),
Col(
"/book/story/chapter/para/quantity",
Column Name( "quantity" ),
Fill( "Use Once" ),
Type( "Character" ),
Format( "best" )
)
),
XML Wizard( 0 ) /* 省略するか、または1に変更して
) XML読み込みウィザードでプレビューする*/
Googleスプレッドシートは、タブのようなシートで構成され、ユーザのGoogleアカウントに保存されるスプレッドシートです。スプレッドシートの編集を断続的に続けたり、他の人と共有したりできます。
Googleスプレッドシートからデータを読み込むスクリプトを書くには、まずGoogleアカウントにログインし、スプレッドシートのURLを取得します。データの構造にも注意を払ってください。たとえば、列見出しがある場合は、データがどの行から始まるのかを把握する必要があります。
スクリプトを初めて実行する際、JMPがGoogleにアクセスできるようにしてください。
Googleスプレッドシートからデータを読み込むには
dt = Google Sheet Import(
Email( "yourgoogleaccount@gmail.com" ), // メールアドレスを変更する
// スプレッドシートのURLを変更する
Spreadsheet( "https://docs.google.com/spreadsheets/d/1J01M4ScGsAHb-bCUa0i575WWvQjXciQIVN0wVTrXDSe/edit#gid=2303744702" ),
Sheets( "May","June" ), // スプレッドシート名を指定する
Sheet Settings( // データの構造を指定する
Has Column Headers( 1 ),
Headers Start on Row ( 1 ),
Data Starts on Row( 2 ),
Cell Range( "" ),
Import Cell Colors( 1 ),
Suppress Empty Columns( 1 )
)
);
メモ: セキュリティや国の制限などの詳細については、『JMPの使用法』のGoogleスプレッドシートの読み込みについてを参照してください。
JMPデータテーブルをGoogleスプレッドシートに書き出すには
JMPデータテーブルを新しいGoogleスプレッドシートに書き出す場合は、次の例にならってスクリプトを作成します。
email = "yourgoogleaccount@gmail.com"; // Googleアカウントを変更する
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Google Sheet Export(
dt,
Email( email ),
New Spreadsheet( "JSL Example" ), // スプレッドシートの名前を指定する
Sheet Name( "Example 1" ) // シートの名前を指定する
);
書き出しが正常に完了すると、ログに「1」が戻されます。
JMPデータテーブルを既存のGoogleスプレッドシートに書き出す場合は、次の例にならってスクリプトを作成します。既存のスプレッドシートのURLが必要になります。
id = "https://docs.google.com/spreadsheets/d/1J01M4ScGsAHb-bCUa0i575WWvQjXciQIVN0wVTrXDSe/edit#gid=2303744702"; // URLを変更する
email = "yourgoogleaccount@gmail.com"; // Googleアカウントを変更する
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Google Sheet Export(
dt,
Email( email ),
Spreadsheet( id ),
Sheet Name( "Example 1" )
);
書き出しが正常に完了すると、ログに「1」が戻されます。
メモ: セキュリティや国の制限などの詳細については、『JMPの使用法』のGoogleスプレッドシートの書き出しについてを参照してください。
SASファイルを、SASサーバーに接続せずにデータテーブルとして開きます。
sasxpt = Open( "$SAMPLE_IMPORT_DATA/carpoll.xpt" );
ラベルを列名に変換するには、Use Labels for Var Namesという引数を使用します。
sasdbf = Open( "$SAMPLE_IMPORT_DATA/Bigclass.sas7bdat", Use Labels for Var Names( 1 ));
.xptおよび.stx形式のファイルも使用できます。
Windowsでは、SASサーバーに接続してSASデータを開くこともできます。SAS Metadata Serverへの接続を参照してください。
Webサイトや別のコンピュータからデータを読み込むことができます。JMPデータテーブル、Webページで定義されているテーブル、JMPでサポートされている他の種類のファイルを開くことができます。
Webサイトにあるファイルを開くには、Open()コマンドの中でURLを指定します。その際、URLを引用符で囲んでください。JMPのデータテーブルほか、JMPで使用できる種類のファイルはこの方法で開くことができます。
Open( "http://company1.com/Repairs.jmp" );
Open( "http://company1.com/My Data.txt", text); // macOS上のテキストを指定する
Webページには、表形式のデータが含まれていることがあります。次の例では、表をJMPデータテーブルとして読み込みます。
Open( "http://company1.com", HTML Table( n ) );
nは、読み込みたい表を表します。たとえば、ページ上にある4つ目の表を読み込むには、HTML Table(4)と指定します。値を省略した場合、ページ上の最初の表だけが読み込まれます。
JMPは、HTMLタグの<th>で定義されているテーブル見出しを保持しようとします。これらのテーブル見出しはデータテーブル内の列名に変換されます。<th>タグが間違っている場合やない場合には、ColumnNames(n)を使用してn番目の行を指定してください。デフォルトでは、DataStarts(n)が次の行になりますが、DataStartsで行を指定することもできます。
データタイプが式である列を使用して、Web上のイメージをデータテーブルに読み込むことができます。以下の例では、新しいデータテーブルが作成され、そこに2つのイメージが追加されます。
dt = New Table( "test", New Column( "Image", Expression ) );
dt << Add Rows( 1 );
dt:Image = New Image( Open( "https://www.jmp.com/support/help/en/16.0/jmp/images/iris_first.gif" ) );
dt << Add Rows( 1 );
dt:Image = New Image( Open( "https://www.jmp.com/support/help/en/16.0/jmp/images/trimeth.png" ) );
Multiple File Import()と[イベントハンドラー]スクリプトを用いて、フルサイズの写真のディレクトリにリンクするサムネイル画像のデータテーブルを作成できます。この例は、セルの高さを設定して、一番高さのあるサムネイルに合うようにしています。
メモ: 多くの場合、[複数ファイルの読み込み]は複数のテキストファイルを読み込むときに使用されます。しかし、この例ではオプションを使用して画像を読み込む方法を紹介しています。
path = "$SAMPLE_IMAGES/"; //画像はこのディレクトリにある
{dtx} = Multiple File Import(
<<Set Folder( path ),
<<Set Name Filter( "*.jpg; " ),
<<Set Name Enable( 1 ), /* 名前によるフィルタリングを可能にする
この例では拡張子.jpgを持つファイル */
<<Set Add File Name Column( 1 ), // ファイル名を含む列を追加
<<Set Add File Size Column( 1 ) //ファイルサイズの列を追加
) << Import Data;
/* 「ファイル名」は、画像のファイル名を含む列。
列は画像のリンクのために必要だが、表示されていなくてもよい。*/
dtx:ファイル名 << Hide;
maxheight = 0;
For Each Row( // データテーブルのサイズを最小にするために各画像を作成し直す
x = Eval( dtx:画像 );
x << Scale( .1 ); // 画像を10%に縮小する
m = x << Get Pixels; //画像を圧縮して作成し直す
dtx:画像 = New Image( m );
maxheight = Max( maxheight, (dtx:画像[] << Get Size)[2] );
// 幅×高さが返され、[2]により高さを取得する
);
Eval( /* path変数の値をクリックハンドラーに挿入する。path変数は後で使用できなくなるが、
この変数の値をファイル名の列の値と連結して画像へのリンクを作成する */
Eval Expr(
dtx:画像 << Set Property(
"Event Handler",
Event Handler( // 列のイベントハンドラープロパティ
Click( JSL Quote( Function( {thisTable, thisColumn, iRow},
// 画像へのリンクを挿入
Open( Expr( path )||Char( thisTable:FileName[ iRow ] ) ); ); ) ),
Tip( JSL Quote( Function( {thisTable, thisColumn, iRow}, Char( thisTable:FileName[ iRow ] ) || "をビューアーで開く"; ); ) ),
// リンクの色--青
Color( JSL Quote( Function( {thisTable, thisColumn, iRow}, 5; );) )
) )
)
);
// 最大の高さに2ピクセル追加する
dtx << Set Cell Height( maxheight + 2 );
/* データを保存してデータテーブルのサイズが
オリジナルファイルのものよりかなり小さいことを示す */
dtx << Save( "$TEMP/Sample Images.jmp" );
Show( File Size( "$TEMP/Sample Images.jmp" ), Col Sum( dtx:ファイルサイズ ) );
JMPでは、共有している別のコンピュータやネットワークドライブに保存されたファイルを読み込むことができます。以下の例は、Windowsからファイルを開く方法を示します。
Open( "\\Data\Repairs.jmp" ); // UNC名
Open( "z:/Data/Repairs.jmp" ); // マップされたドライブ文字
Open( "Repairs.jmp" ); // スクリプトが入っているディレクトリからの相対パス。読み込むファイルも同じディレクトリに保存されている
macOSは、UNC名やドライブ文字といったコンセプトを採用していません。そのため、ユーザインターフェースを通じてボリュームをマウントする必要があります。スクリプトで行うことも可能ですが、少なくとも一度、インタラクティブに接続し、キーチェーンにパスワードを保存してあることが前提になります。
以下は、macOSまたはWindowsからリモートのボリュームに接続する例を示します。
mount = Function( {server},
{Default Local},
If( Host is( Mac ),
Run Program(
Executable( "/usr/bin/osascript" ),
// スクリプトに含まれるすべての「^server^」を実際のサーバー名で置き換える
Options( {"-e", Eval Insert( "mount volume \!"smb://^server^\!"" )} ),
Read Function( "text" )
);
server = Concat Items( Remove( Words( server, "/" ), 1 ), "/" );
Eval Insert( "/Volumes/^server^" );
,
Eval Insert( "\!\\!\^server^" )
)
);
users = mount( "data.company.com/Users" );
Files In Directory( Eval Insert( "^users^/Smith" ) );
JSON(JavaScript Object Notation)はJavaScriptに基づいたデータ転送のフォーマットです。基本的な性質の多くがC言語と共通で、読んだり書いたりしやすいものとなっています。このためJSONは移植しやすく、またJMPでも読み込むことが可能です。
JSON | JSL |
---|---|
配列 | リスト(値のシーケンス) |
オブジェクト | 連想配列(名前の付いた変数のセット) |
数値 | 数値 |
文字列 | 文字列 |
true | 1.0 |
false | 0.0 |
null | .(欠測値) |
JSONは名前と値のペアの連想配列で構成されます。たとえば、次に示すJSONコードは名前と値のペアを示しています:
"[ { \!"key1\!": \!"a\!", \!"key2\!": \!"b\!"}, {\!"key1\!": \!"c\!", \!"key2\!": \!"d\!" }, {\!"key2\!": \!"f\!", \!"key1\!":\!"e\!", \!"key3\!": \!"g\!"}]";
それぞれのリストはデータテーブルの列として読み込まれます。「key1」は最初の列の名前です。その列の最初の値は、「a」になります。二番目の値は「c」で、三番目の値は「e」です。
JSON To Data Table()を用いて、JSONをデータテーブルに変換します。
js = "[ { \!"key1\!": \!"a\!", \!"key2\!": \!"b\!"}, {\!"key1\!": \!"c\!", \!"key2\!": \!"d\!" }, {\!"key2\!": \!"f\!", \!"key1\!":\!"e\!", \!"key3\!": \!"g\!"}]";
d = JSON To Data Table( js ); //JSONをデータテーブルに変換
d << New Data View; // データテーブルの表示
図9.6 読み込まれたJSONデータ
JSON To List()を用いて、JSONを含む文字列をリストにすることもできます。
list = JSON To List(
"[ { \!"name\!": \!"KATIE\!", \!"age\!": 12, \!"sex\!": \!"F\!", \!"height\!": 59, \!"weight\!": 95 }, { \!"name\!": \!"LOUISE\!", \!"age\!": 12, \!"sex\!": \!"F\!", \!"height\!": 61, \!"weight\!": 123 }, { \!"name\!": \!"JANE\!", \!"age\!": 12, \!"sex\!": \!"F\!", \!"height\!": 55, \!"weight\!": 74 } ]"
);
Show( list );
list = {{{"name", "KATIE"}, {"age", 12}, {"sex", "F"}, {"height", 59}, {"weight", 95}}, ...}}};
As JSON Expr()は連想配列をJSON文字列に変換します。これにより、データをJSONドキュメントとして書き出すことができます。
list_of_associative_arrays = {["key1" => "a", "key2" => "b"], ["key1" => "c",
"key2" => "d"], ["key2" => "f", "key1" => "e", "key3" => "g"]};
jx = As JSON Expr( list_of_associative_arrays );
"\[{\!"key1\!":\!"a\!",\!"key2\!":\!"b\!"}..."\[{\!"key1\!":\!"a\!",\!"key2\!":
\!"b\!"}
メモ: データテーブルを非表示で読み込むには、JSON To Data Table()に引数 Invisible(1)を含め、New Data Viewを外します。
Hierarchical Data Format、バージョン5(HDF5)は、データを保存するためのポータブルファイル形式です。HDF5ファイルはグループとデータセットで構成されています。ファイルを読み込むとき、JMPはグループを開きます。このグループには、データセットの名前が含まれています。
JMPで扱えるのは、数値(integer、float、double)または文字列のタイプの列のみ、3次元以下のsimpleタイプのcompoundファイルのみです。
1,000,000個までの列を読み込むことができます。行数には制限はありません。
構文は次のとおりです。
Open( "filename.h5", {"list_of", "dataset_names"});
無効なデータセット名が渡されると、エラーがログに書き込まれます。
ESRIシェープファイルは、地図の作成に使用される地理空間ベクトルデータの一形式です。JMPは、シェープファイルをデータテーブルとして読み込みます。.shpシェープファイルは、各シェープの座標で構成されます。.dbfシェープファイルには、地域を表す値が含まれます。JMPで地図を作成するには、データの構造を調整し、ファイルに専用の接尾辞をつけて保存します。
次の例は、.shpファイルを読み込み、-XYという接尾辞をつけて保存します。
dt = Open( "$SAMPLE_IMPORT_DATA/Parishes.shp"),
:X << Format( "Longitude DDD", 14, 4 );
:Y << Format( "Latitude DDD", 14, 4 ) );
dt << Save( "c:/Parishes-XY.jmp" );
.dbfファイルを-Nameという接尾辞をつけて保存します。
dt = Open( "$SAMPLE_IMPORT_DATA/Parishes.dbf" );
dt << Save( "c:/Parishes-Name.jmp" );
データの構造を調整するには、-Name.jmpファイル内の名前に「地図の役割」列プロパティを追加するなど、いくつかの手順が必要となります。『グラフ機能』の「地図の役割」プロパティを参照してください。
Open Database()は、ODBC(Open Database Connectivity)を使ってデータベースを開き、データを抽出し、JMPデータテーブルに読み込みます。データベースアクセスを参照してください。
JMPは、データベースファイル(.dbf)ファイルもデータテーブル形式に変換します。
sasdbf = Open( "$SAMPLE_IMPORT_DATA/Bigclass.dbf",
Use Labels for Var Names( 1 )
);