連載プロデル入門の第14話になりました。今回から何回か、ご要望が多かったプロデルを使ったデータ整理についてのプログラムを作ります。今回は特にCSVファイルを使ったデータの抽出や並べ替え、集計について紹介します。
プロデルではデータを扱う方法がいくつかありました。実はこれまで、よりプロデルらしい書き方、種類の提供方法を模索して仕様が揺らいでいた経緯があり、簡単なことでも作るのが難しい状況でした。今回の記事を通じて最新のプロデルでおすすめするデータ整理のプログラミングについて機能を整理して紹介します。
CSVファイルとは
CSVとはComma-Separated Valuesの略で、値をカンマで区切って列挙した文字列のことです。CSVをテキストファイルとして保存したものがCSVファイルです。CSVファイルは、データを扱うための、最も単純で広く使われているファイル形式です。
CSVファイルは、よくExcelなどの表計算アプリで開いたり保存したりします。
CSVファイルは、テキストファイルなのでメモ帳でも開くことができます。メモ帳でCSVファイルを開くと、例えば次のような「,」で区切られた文字列や数字の羅列が書かれています。
1,たろう,abc@xxx.com,http://www.xxx.com/ 2,はなこ,def@xxx.com,http://www.yyy.com/
表と行と列
CSVファイルを取り扱う時は、CSVファイルの内容を1つの表(テーブル)として考えて扱うと分かりやすいです。表は、行と列で情報をまとめたものです。列には見出しがあります。また1件のデータ(レコード)を1行で記録して、行ごとに見出し列に対応する情報を記録していきます。
このように表で情報を整理する仕組みは、Excelなどの表計算ソフト(スプレッドシート)や、MySQLなどの関連データベース(RDB)などで使われています。
データ表を使おう
プロデルでCSVファイルを扱うときは、「データ表」種類を使うのが便利です。データ表には、「データ列」種類, 「データ行」種類があり、これらでデータを取得したり編集したりします。データ表は、CSVファイルへ保存することもできます。
では、早速データ表を使ってみましょう。
データ表の作成と保存
次のプログラムでは、空の「データ表」種類を作り、3列の項目と、2行のデータを加えています。その後、その内容をdata.csvに保存します。
列には、見出しが付けられます。データは、1件分を配列で追加することができ、その時は、各要素の値が、見出しの順に対応付けられて記録されます。
データ表を作ってデータとする
データに{「名前」,「メール」,「誕生日」}という列を加える
データへ{「松下」,「matsu@gmall.com」,「1992/04/16」}を加える
データへ{「山中」,「ymnk@potmail.co.jp」,「1993/07/10」}を加える
データの見出し行は、〇
データを「data.csv」へ保存する
上のプログラムを保存して実行してみてください。実行するとプログラムと同じフォルダに、data.csvというファイルが作成されます。
作成されたdata.csvは、Excelやメモ帳などで開くこともできます。次のスクリーンショットは、Visual Studio Codeで開いた時に表示されるdata.csvの中身です。カンマで区切られた値が見出しも含めて3行保存されていることがわかります。
なお、少し古いバージョンのExcelで開くと日本語が文字化けします。その時には、次のようなプログラムで文字コードをShift-JISにして保存する必要があります。
データを「data.csv」へ「Shift-JIS」で保存する
データ表の読み込み
今度は、保存したCSVファイルを空のデータ表に読み込みます。データ表の「読み込む」手順を使って読み込めます。
データ表を作ってデータとする
データの見出し行は、〇
データへ「data.csv」から読み込む
データの一覧のすべての【行要素】についてそれぞれ繰り返す
行要素(1)を報告する
そして
データ表の「一覧」設定項目を使うと、データ表の内容を2次元配列として取得できます。
データ表のオブジェクト構造
データ表は、「データ列」と「データ行」が組み合わされて作られています。列の数だけデータ列のオブジェクトが作られ、行の数だけデータ行のオブジェクトが作られます。
列を追加すると新しいデータ列が作られ、行を追加すると新しいデータ行が作られます。これらの操作をするには「加える」手順を使います。また、CSVファイルからデータ表を読み込むと、ファイルの内容に応じて「データ列」と「データ行」が作られます。データ表のそれぞれの行は、「データ行」種類のオブジェクトになっています。
データ表のレコードを編集する
データ表の特定の行の内容を変更してみます。
「データ表」の「~の行目を取得する」手順を使うと、特定の行の内容が格納された「データ行」オブジェクトを取得できます。このデータ行からさらに列番号か見出しで、それに対応する値を設定したり取得したりできます。
データ表を作ってデータとする
データに{「名前」,「メール」,「誕生日」}という列を加える
データへ{「松下」,「matsu@gmall.com」,「1992/04/16」}を加える
データへ{「山中」,「ymnk@potmail.co.jp」,「1993/07/10」}を加える
データの2行目を取得して対象行とする
対象行の2列目を取得して報告する
対象行の2列目に「ymnk@outlook.jp」を設定する
対象行の2列目を取得して報告する
行の削除
特定の行を削除するには、次のように「削除する」手順を使って削除する行番号を指定します。
データ表を作ってデータとする
データに{「名前」,「メール」,「誕生日」}という列を加える
データへ{「松下」,「matsu@gmall.com」,「1992/04/16」}を加える
データへ{「山中」,「ymnk@potmail.co.jp」,「1993/07/10」}を加える
データから1行目を消す
データの一覧を報告する
データを検索する
今度は、CSVファイルにあるデータから特定のデータを検索するプログラムを作ってみます。ここでは郵便番号データから指定した郵便番号を探して、その住所を調べるプログラムを作ってみます。
郵便番号データは、日本郵便のウェブサイトからダウンロードできます。
郵便番号データダウンロード – 日本郵便 (japanpost.jp)
「全国一括」をダウンロードします。
KEN_ALL.ZIPをダウンロードして、このzipファイルを展開します。
(必ずエクスプローラで「すべて展開…」で展開するか、アーカイバソフトを使ってzipファイルを解凍してください)
KEN_ALL.csvを開くと、郵便番号データが表示されます。CSVファイルには、郵便番号と対応する都道府県、市町村、町名やそのよみがなが記録されています。例えば、郵便番号2510036に該当する住所が「神奈川県」「藤沢市」「江の島」ということが分かります。
郵便番号データのカンマおきに書かれた値の意味は、ダウンロードページで説明されています。郵便番号は3番目の項目です。7,8,9番目がそれぞれ住所を表す、都道府県,市町村,町名の項目です。
では、KEN_ALL.CSVをデータ表に読み込んで、郵便番号を探すプログラムを作ってみます。
ここでは、扱いやすいように郵便番号検索する手順を定義しておきます。この手順では、データ表の行を1行目から順番に探していきます。
3列目の郵便番号が合致したら、その住所を返します。「返す」文が呼ばれると、繰り返しは中止されて、手順からも抜け出します。該当する郵便番号が最後まで見つからなかった時は無を返します。
データ表を作ってデータとする
データへ「KEN_ALL.CSV」から読み込む
2510036から郵便番号検索して報告する
【郵便番号】から郵便番号検索する手順
データの一覧のすべての【行要素】についてそれぞれ繰り返す
行要素(3)が郵便番号なら
行要素(7)&行要素(8)&行要素(9)を返す
そして
そして
無を返す
終わり
データをソートする
データ表の並べ替えには、「並べ替える」手順を使います。この手順は、並べ替えたい列名を指定すると、その列で並べ替えられます。
このとき、数値の大小で並べ替えたい時には、データ列の「データ型」を整数に変える必要があります。指定しないと文字列順に並べ替えます。
データというデータ表を作る
データに{「名前」,「点数」}という列を加える
データの2列目を取得してそのデータ型を整数に変える
データへ{名前=「山田」,点数=150}を加える
データへ{名前=「高橋」,点数=185}を加える
データへ{名前=「岩田」,点数=115}を加える
データへ{名前=「佐藤」,点数=140}を加える
データへ{名前=「藤田」,点数=90}を加える
データを「点数 DESC」で並び替えて並替後データとする
並替後データすべての一覧を報告する
「並べ替える」手順では、並べ替える基準となる項目を指定します。カンマ(,)で複数の項目を指定することもできます。項目名の後に「 DESC」と付けると降順に並べ替えます。何も指定しないと昇順で並べ替えます。
データ表で集計する
データ表から特定の行や列の内容を配列として取り出して集計したり計算することもできます。
データ表の「~列目を一覧で取得する」手順を使うと、データ表のそれぞれの行の2列目だけを取り出して配列に入れることができます。
データというデータ表を作る
データに{「品名」,「値段」}という列を加える
データへ{品名=「さかな」,値段=350}を加える
データへ{品名=「お肉」,値段=490}を加える
データへ{品名=「ウィナー」,値段=290}を加える
データへ{品名=「から揚げ」,値段=450}を加える
データへ{品名=「プリン」,値段=130}を加える
データの2列目を一覧で取得する
その合計を「合計」として表示する
配列の「合計」手順を使えば、特定の列の合計を計算できます。
データ表で計算する
さらに「繰り返す」文を使って、データ表の「行一覧」にあるすべてデータ行について、複数の項目を組み合わせて計算することができます。
次のプログラムでは、値段と個数を足し合わせた上で、それらの合計を計算します。
データというデータ表を作る
データに{「品名」,「値段」,「個数」,「合計」}という列を加える
データへ{品名=「さかな」,値段=350,個数=1}を加える
データへ{品名=「お肉」,値段=490,個数=1}を加える
データへ{品名=「ソーセージ」,値段=290,個数=2}を加える
データへ{品名=「から揚げ」,値段=450,個数=1}を加える
データへ{品名=「プリン」,値段=130,個数=2}を加える
データの行一覧を行要素にそれぞれ繰り返す
値段=行要素から「値段」を取得したもの
個数=行要素から「個数」を取得したもの
行要素の「合計」に値段*個数を設定する
そして
データから「合計」を一覧で取得して報告する
データから「合計」を一覧で取得して「合計:[その合計]円」を報告する
表部品を使う
ウィンドウでデータ表を見ながら編集したい時には、「表部品」というGUI部品を使います。表部品を使うと、データ表の内容をウィンドウで直接編集できます。
「ウィンドウの設計」画面で表部品を貼り付けて、表部品の「データ表」設定項目に設定することで、そのデータ表の内容を画面上で編集できます。
次のプログラムは、先ほどのデータ表を表部品で閲覧・編集できるようにしたプログラムです。
データというデータ表を作る
データに{「品名」,「値段」}という列を加える
データへ{品名=「さかな」,値段=350}を加える
データへ{品名=「お肉」,値段=490}を加える
データへ{品名=「ウィナー」,値段=290}を加える
データへ{品名=「から揚げ」,値段=450}を加える
データへ{品名=「プリン」,値段=130}を加える
メイン画面を表示する
待機する
メイン画面とは
ウィンドウを継承する
はじめの手順
初期化する
表部品1のデータ表をデータに変える
終わり
初期化する手順
この実質大きさを{663,387}に変える
この内容を「表部品」に変える
この間隔を{4,4,4,4}に変える
初期化開始する
表部品1という表部品を作る
表部品1を初期化開始する
その位置と大きさを{18,13,627,356}に変える
その列見出し高さを34に変える
その移動順を2に変える
その位置固定方向を「上+下+左+右」に変える
その間隔を{4,4,4,4}に変える
表部品1を初期化終了する
初期化終了する
この設計スケール比率を{144,144}に変える
終わり
終わり
家計簿アプリを作る
最後は、表部品を使って、お小遣いをCSVファイルに記録するためのお小遣い帳アプリを作ってみましょう。
仕組みは簡単で、小遣いデータというデータ表を作り、表部品で記録を付けられるようにします。また、「もらった額」と「使った額」から残金を計算できるようにもロジックを作ってみます。入力内容は、小遣い帳.csvに保存することにして、画面を閉じたときに自動的に保存されるようにします。
画面の構成
プロデルデザイナのウィンドウの設計で新しいウィンドウを作ります。ウィンドウには、4つの部品を配置します。
- 表部品 (表部品1)
- フレーム (フレーム1)「まとめ」
- ラベル (ラベル1)「残金」
- テキスト (テキスト1)
残金の計算
残金の計算は、「計算する」手順で定義します。小遣いデータを日付順に並べ替えてから、1行目から順番に「それぞれ繰り返す」文を使って、[残金+もらった額-使った額]を計算していき、残金を計算します。繰り返しが終わった時の残金をテキストボックスに表示します。
また、表形式で値が変更されると、その時に自動的に計算されるように「セルの値が変更された時」のイベント手順を宣言します。
//抜粋
計算する手順
//小遣いデータを日付順に並べ替えて残金を計算します。
残金は、0
小遣いデータを「日付」で並び替えたものを行要素にそれぞれ繰り返す
入金=行要素から「もらった額」を取得したもの
出金=行要素から「使った額」を取得したもの
残金=残金+入金-出金
行要素の「残りのお金」に現在を設定する
そして
テキスト1の内容は、残金
終わり
完成したプログラム
// 小遣い帳 //
データファイルは、「小遣い帳.csv」
//小遣い帳の項目(見出し)を定義します。
小遣いデータというデータ表を作る
小遣いデータの見出し行は、〇
小遣いデータに{「日付」,「ことがら」,「もらった額」,「使った額」,「残りのお金」}という列を加える
//項目に入れられる値のデータ型を設定します。
小遣いデータの1列目を取得してそのデータ型を日時形式に変える
小遣いデータの3列目を取得してそのデータ型を整数に変える
小遣いデータの4列目を取得してそのデータ型を整数に変える
小遣いデータの5列目を取得してそのデータ型を整数に変える
//CSVファイルが作成されていれば小遣いデータへ読み込みます。
データファイルというファイルが存在するなら
小遣いデータへデータファイルから読み込む
そして
メイン画面を表示する
待機する
メイン画面とは
ウィンドウを受け継ぐ
はじめの手順
初期化する
//CSVファイルから読み込んだ小遣いデータを表部品に表示する
表部品1のデータ表を小遣いデータに変える
計算する
//表部品では、日付が新しい名目から並ぶようにする
表部品1の1列目を降順に並び替える
終わり
初期化する手順
この実質大きさを{862,343}に変える
この初期位置を「中央」に変える
この内容を「小遣い帳」に変える
このドラッグドロップを○に変える
この間隔を{4}に変える
初期化開始する
フレーム1というフレームを作る
その位置と大きさを{615,21,235,301}に変える
その内容を「まとめ」に変える
その移動順を6に変える
その位置固定方向を「上+下+右」に変える
テキスト1というテキストをフレーム1へ作る
その位置と大きさを{15,72,198,35}に変える
その行間を28に変える
そのフォントを「MS UI Gothic,14」に変える
ラベル1というラベルをフレーム1へ作る
その位置と大きさを{15,30,68,28}に変える
その内容を「残金」に変える
そのフォントを「MS UI Gothic,14」に変える
その自動調整を○に変える
その移動順を1に変える
表部品1という表部品を作る
表部品1を初期化開始する
その位置と大きさを{25,21,562,301}に変える
その列見出し高さを41に変える
その移動順を7に変える
その位置固定方向を「上+下+左+右」に変える
表部品1を初期化終了する
初期化終了する
この設計スケール比率を{144,144}に変える
終わり
表部品1のセルの値が変更された時の手順
計算する
終わり
計算する手順
//小遣いデータを日付順に並び替えて残金を計算します。
残金は、0
小遣いデータを「日付」で並び替えたものを行要素にそれぞれ繰り返す
入金=行要素から「もらった額」を取得したもの
出金=行要素から「使った額」を取得したもの
残金=残金+入金-出金
行要素の「残りのお金」に現在を設定する
そして
テキスト1の内容は、残金
終わり
閉じた時の手順
//ウィンドウを閉じた時にCSVファイルへ保存します。
小遣いデータをデータファイルへ保存する
終わり
終わり
90行程度のプログラムで、ちょっとしたアプリを作ることができます。
プロデルは、オブジェクト指向でプログラミングするので、プログラム文が長くなってしまいがちです。VBAなどと比べると少し煩わしいところもあります。一方で、見出しの名前を使ってレコードの値を取得し計算できるので、プログラムの意味を読み返した時に理解しやすい所はメリットです。
見出しや計算方法を変えることで、貯金管理や在庫管理など、自分の欲しいアプリに作り替えることもできます。自分にとって便利で使いやすくなるように改良することもプログラミングの良さの一つです。ぜひ、チャレンジしてみて下さい。
まとめ
今回は、データ表を使ってCSVファイルを読み書きするプログラムを紹介しました。データ表を通じて、CSVファイルのデータを編集したり、必要な部分を抽出したり、計算したりできます。また表部品を使うことでGUIでより簡単にデータ表を編集できる機能もあります。ぜひ活用してください。
※当ブログの記事の著作権はゆうとにあります。プロデルに関係が無い目的で、文章や図表,プログラムを複製, 改変, 移植して掲載することを堅く禁止します