シリアル受信リアルタイムグラフCSVログまでできたので、ファイルをEXCELで読んで処理しようとしたらリアルタイムで実験操作を時系列にログしてあるため、データの順序が飛び飛びで、マトリックスな表にするには整理が大変な手間がかかることが判りました。VBAでプログラム組もうかとおもいましたが、どうせプログラムを組むなら、学習中のVB.NETのほうが、システムに収まりやすいので、ファイルデータ処理プログラムにすることにしました。マトリックスを目視しながら組んで、各種行列計算させる目的です。
※2021年6月追記10か月経て「DataGridViewを使っていてよかった」
データベースとセットで使うなどややこしい使い方は私はしてません。
DataGridViewは、大量の計測データを扱う場合には、最適な道具になりますので、時間をかけてでも習得する価値があります。変数の数が多くても、まとめて1行の命令で入力できます。更にマルチタスク時にデータ失われてしまうことがありますが、dgvに書き込んでおけば、タスク割り込みが発生しても安全に保存されてます。後でまとめてCSVファイルにして保存、読み込みすればいいです。
dgv1.ColumnCount=N ‘列数を確保
dgv1.Rows.Add( 変数1、変数2,・・・・・、変数N)
もしくは、dgv1.Rows.Add(配列名)だけで1行一括入力できます。
このAdd命令だけで、変数N個を1行に入力できます。行数は自動的に増やして入力してくれます。何万行でも高速に行がスクロールするのでExcelなんて遅くて使えなくなります。千行以上のデータならDataGridViewで処理したほうが生産性あがります。Web検索では、いろいろな行入力方法を紹介されてますが、時系列大量データを入力する事例が見当たりませんでしたが、唯一解説されている記事がありました。行入力の仕方の解説記事
●DataGridView行の追加と削除を解説されているサイト様がありました。感謝です。
https://www.fenet.jp/infla/column/network/datagridview%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B94%E3%81%A4%EF%BD%9C%E8%A1%8C%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%82%84%E5%89%8A%E9%99%A4%E3%81%AE%E6%96%B9%E6%B3%95%E3%82%92%E8%A7%A3%E8%AA%AC/
※2021年9月追記 シリアル受信データをDataGridViewへログするプログラム作りました。
【VB.NET】シリアル受信データをDataGridViewにログ<便利ロガー>
■DataGridViewはまって2日間かかった
EXCELみたいな表だと思っていじり始めたら、全く違ってました。
ExcelVBAなら CELLS(行、列)で指定して作業を進められるのですが
DataGridViewで同じことをするには、各種の方法があってどれを使うのか
全くわかりません。中には、列、行順で指定しなければいけません。
なぜこんなに面倒なことになっているかわかりませんが、用途的にEXCELではできない表処理を狙っているのではないでしょうか。ですのでExcel VBAに慣れていると面喰います。DataBase機能を使うためのDGVらしいので
私の使い方は、本道からそれているいるので後日変更します。
※2020年11月3日追記
ようやく行列計算電卓(Matrix_Calculator)プログラム基本部分できました。
DGVは、ヘッダー部(列管理)とデータ部(行管理)と2つに分けてプログラムを作ることがポイントです。今回はDataTableとDataSetは使いませんでした。表編集をしながら、DataTableを管理するのが大変だからです。
【VB.NET】Matrix_Calculator_rev02作った<基本部分動作確認>
いろいろ検索してみると、DGVは、.NETのデータベース機能の表示を担当する機能らしく、データのハンドリングは、データベースのDataTableに入力して、表示をDGVにさせるみたいなので、DataTableを使わないと不便になるようです。今回は、ExcelVBAライクの使い方でプログラムしましたが、次回から、DataTable機能も入れて作ってみます。現在検索しながら学習中です、
状況は、Appendixにメモしながら進めます
DataTableの解説で分かり易いのがありました。感謝です。
https://hironimo.com/prog/vbnet/datatable/
DataBase>DataSet>DataTableという階層があるみたいです。
https://www.fenet.jp/dotnet/column/environment/791/
どこまで自分の用途(実験データの一般化逆行列式の計算)で使えば便利なのか検討しながら進めます。
※10月30日追記 DataTableを使う練習を始めました。デバッグ中にDataTableの中身が即確認できる便利な機能
DataTable Visualizerがあるので、配列にデータを書き込むよりデバッグし易くて便利だと思います。
学習しながら便利だと思ったことのメモ
・メモ0:DataGridView1という名前長すぎて書きにくいので、Propertyの名前を例えばdgv1変更してENTERするとDataGridView1という記述は、全部dgv1に代わってPgm書きやすくなります。 |
・メモ1:DataTableにデータを作っておくとDataGridViewに書き込むのが1行ですむ。 DataGridView1.DataSource = dt |
※12月1日追記 DGVは、多項目(6個以上)のデータを扱う場合は、非常に便利です。
ListBoxやTextBoxやRichTextBoxで表示するより遥かに、使いでがあるので将来性のあるプログラム作れます。
ExcelVBAでのセル書き込みとは違うので最初は面喰うのですが、慣れれば便利です。
特徴1:最上行と最左列は、ヘッダー用のマス目になっていてデータは入力されない定義になってます。
=>上ヘッダー: dgv1.Columns(columnNo).HeaderText =Str で一番上の行に項目入力できます
=>左ヘッダー: dgv1.Rows(rowNo).HeaderCell.Value = Sstr で左端の列に項目を入力できます。
特徴2:データセルは、ゼロ行ゼロ列から始まるので座標指定に注意が必要
=>dgv1.Rows(rowNo).Cells(colNo).Value=数値とか文字 私は(i,j)座標指定では使ってません。
特徴3:セル数の定義が必要に応じてその場で変更できるので、1つのDGVで多種類のデータを表示できる
=>dgv1.RowCount=データの行数設定または取得 dgv1.ColumnCount=データの列数設定または取得
ここで注意は、行数列数であって、セル座標はゼロから始まるので、
3行3列の一番右下セルは dgv1.Rows(2).Cells(2)=データ数か文字 となります。
特徴4:dgvを一括でCSVで保存、読み込みさえ作ってしまえば、万能で使える
=>1枚のdgvを切り替えてサイズと項目が異なるデータを表示できるので、それを同じファイル保存
プログラムで保存、読み出しができるので、データハンドリングが楽になります。
=>私はDataTableやDataBaseは使ってません。センサの時系列データの場合データベース機能は邪魔です。
参考サイト様 http://hensa40.cutegirl.jp/archives/760
●やったこと1:DGVは、データが入るたびに、行とか列を1つずつ新規に足していく使い方が一般的らしいですが、行列座標指定だと定義されてない座標を指定してエラー多発なのでスタート時点で、大きめな表を作ってしまうことで逃げた。
=>しかし、この方法は後々変更のたびに、不便なため、一般的にデータの入力数だけ行列を増やしていく方法のほうが手離れがいいようです。後日改良しますので、本プログラムは参考にはなりません。
※12月25日追記
最終的にDGVへの行データ入力はこの命令で落ち着きました。
dgv1.Rows.Add(1列目データ、2列目データ,・・・・)
最下部で行を1行追加してその行に()内のデータをまとめて入力できます。一挙に1行まとめて書き込めるのでこの方法が一番簡潔です。
dgv1.Rows().Cells()で入力していく方法は、かえって面倒です。
スタート時にDGVのサイズを決めてしまうのもデータ量がわからないので危険ですので、毎回行をAddしながら入力していくのが良いです。
最もシンプルな行入力命令が推奨です。
dgv1.Rows.Add( 変数1、変数2,・・・・・、変数N) |
、
行も一番下に自動追加してくれるので、1行だけで入力完了します
①CSVファイル
CSVの扱い、今まで自己流でCSVファイルを作ってきましたが、EXCELは自動的に読んでくれましたが、DGVに書き込むためには改行の扱いが問題になりました。検索するとCSVは、CRLF改行記号は使ってはいけないそうです。TABなどで改行マークをつけるらしいです。
今回のプログラムは、CSVファイルを読み込む時に、CRLF有でも無しでも、行の終わりを行の要素数で管理して、バッファの配列の先頭要素readata(0)=その行の要素数を書き込んでそれを見ながら、DGVに書き込むようにしました。
CSVファイルの行のカウントは、こちらのページをコピペさせていただきました。感謝です。
http://gigasmegas.com/?p=1054
CSVファイルの列数は、行データによって変化するので、全体を読みながら最大列数を記憶しておいて、常に更新して全データを読み終わったら、
最大行と最大列でDataGridViewを前もって作ります。
DataGridView1.RowCount = maxRowCSV |
DataGridView1.ColumnCount = cIndex_max |
●やったこと2:セルの書き込みは座標指定でおこなう。
自分用独形式ファイル
自分使いのデータなので、サイズも大体決まっているので、その範囲の最大値で表を作ってしまいます。
DataGridView1.ColumnCount = 30 DataGridView1.RowCount = 200 |
DataGridView1.Rows(行).Cells(列).Value=データ |
■サンプルプログラム
①一般のCSVファイル(カンマ区切りで、CRLF有無対応)をサイズは自由です。ただし、大きなファイルはEXCELよりは相当遅いので、1000行以下のデータを扱ったほうがよさそうです。
csvチェックボックスをいれると普通のCSV読み込みます。
②私の実験用ログファイルの処理用
たくさんのファイルの中から、欲しいデータを抽出して、合体させる機能がついてます。DGVをみながら、ファイルを読み込み編集します。
csvチェックボックスをはずすと専用ファイルモードになります。
●参考にさせていただいた記事
DGVは、無数に記事があるのですが、ある特定用途向けみたいなのが多く
シンプルなものがなくて、迷いました。そこで、一番シンプルに説明している記事がこちら様でした。感謝です。
https://www.fenet.jp/dotnet/column/%E8%A8%80%E8%AA%9E%E3%83%BB%E7%92%B0%E5%A2%83/928/#2
■コード(未完成なので、機能部分を参考にしていただければ幸いです)
FORM1は、Button1とDataGridView1とCheckBox1だけあればいいです。
(デバッグ用のRichTextBox1も入れてありますが、Visible=Falseで隠してあります、エラーがでるようなら追加してみてください)
コードは、GISTにアップしてあります。これを基に、一般化逆行列計算を
いれて、6分力センサの干渉補正のリアルタイム化をします。
https://gist.github.com/dj1711572002/95c81b628d1a54c4c31209aed0d74ef9
■APPEDIX(DataSet>DataTable>DataGridView.Datasourceと関連用語を増やしてきてます)
DataTableの解説で分かり易いのがありました。感謝です。
https://hironimo.com/prog/vbnet/datatable/
DataBase>DataSet>DataTableという階層があるみたいです。
https://www.fenet.jp/dotnet/column/environment/791/
DataSetをDataGridViewに表示するには、DataGridView.DataSourceにバインドする必要があるみたいです。
https://symfoware.blog.fc2.com/blog-entry-787.html