文字列と数字が混ざっ​たcsvファイルから​特定のデータを抜き出​す方法

初心者のため初歩的な質問かもしれませんが、行き詰ってしまったのでご教示いただきたいです。
ドロップダウンボックスで選択した項目(A~G)について、ボタンを押したら特定のフォルダにあるcsvファイルから対応したidのみ抜き出し保存かつ新規csvファイルに保存する方法を教えていただきたいです。
自分でコードを作ってみたのですが、文字が入っているとうまくcsvファイルが読み込めなかったり、指定のidを取り出すこともうまくできず困っております。

 Accepted Answer

Atsushi Ueno
Atsushi Ueno on 2 Mar 2023
Edited: Atsushi Ueno on 2 Mar 2023

2 votes

>文字が入っているとうまくcsvファイルが読み込めなかったり、指定のidを取り出すこともうまくできず
readmatrix 関数や readtable 関数なら、出力データ型をテキストにする事でうまく読み込めます。
最初に一度だけ読み込んでおけば良い様なのでstartupFcn()で実行するのが良いかと思います。
classdef app1 < matlab.apps.AppBase
properties (Access = private)
csv_file_path % 特定のフォルダにあるcsvファイルのパス
csv_table % csv⇒table
id % 取り出したid
end
methods (Access = private)
function startupFcn(app) % 最初に一度だけ実行するスタートアップ関数
app.csv_file_path = 'https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1311960/sample.csv';
app.csv_table = readtable(app.csv_file_path,'TextType','string'); % readtable 関数で Table を出力
end
function ButtonPushed(app, event) % ボタンを押したときのコールバック関数
% ドロップダウンボックスの選択項目(A~G)から指定のidを取り出す
app.id = app.csv_table{app.csv_table.name==app.DropDown.Value,2};
writematrix(app.id); % かつ新規csvファイルに保存する
end
end
end

5 Comments

Atsushi Ueno
Atsushi Ueno on 2 Mar 2023
Edited: Atsushi Ueno on 2 Mar 2023
readmatrix 関数版です。動かして確認してないけど多分動くと思います。
classdef app1 < matlab.apps.AppBase
properties (Access = private)
csv_file_path % 特定のフォルダにあるcsvファイルのパス
csv_string % csv⇒string配列
id % 取り出したid
end
methods (Access = private)
function startupFcn(app) % 最初に一度だけ実行するスタートアップ関数
app.csv_file_path = 'https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1311960/sample.csv';
app.csv_string = readmatrix(app.csv_file_path,'OutputType','string'); % readmatrix 関数で String 配列を出力
end
function ButtonPushed(app, event) % ボタンを押したときのコールバック関数
% ドロップダウンボックスの選択項目(A~G)から指定のidを取り出す
app.id = app.csv_string(app.csv_string(:,1)==app.DropDown.Value,2);
writematrix(app.id); % かつ新規csvファイルに保存する
end
end
end
A.T
A.T on 3 Mar 2023
ご回答ありがとうございます。
初歩的な質問で申し訳ありませんが、私自身app designerを使用してプログラミングをしているため、回答いただいた、
classdef app1 < matlab.apps.AppBase
properties (Access = private)
csv_file_path % 特定のフォルダにあるcsvファイルのパス
csv_string % csv⇒string配列
id % 取り出したid
end
methods (Access = private)
function startupFcn(app) % 最初に一度だけ実行するスタートアップ関数
app.csv_file_path = 'https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1311960/sample.csv';
app.csv_string = readmatrix(app.csv_file_path,'OutputType','string'); % readmatrix 関数で String 配列を出力
end
こちらの箇所について編集することができないのですが何か方法はあるのでしょうか・・・?
また、私自身で書いてみたプログラムが下記のようなものですが、こちらだとchar型とtable型の不一致によって比較ができずエラーを吐いてしまいます。。。
function ButtonPushed(app, event)
cd 'C:\tmp\matlab
uniqueid = readtable("sample.csv","TextType","string")
uniqueid2 = uniqueid(:,1)
Item = app.DropDown.Value;
disp(Item)
disp(uniqueid2)
if uniqueid(:,1) == Item
idnum = uniqueid(row,:);
end
何か、比較できるように変換する方法があるのでしょうか?table2**系の関数は試してみたのですがうまくいかず。。。ご教示願います。
>こちらの箇所について編集することができないのですが何か方法はあるのでしょうか・・・?
  • propertiesは、プロパティを追加する事でコードに現れ、編集可能になります
  • startupFcnは、startupFcnコールバックを追加する事によってコードに現れ、編集可能になります
  • 設計ビューの右クリックメニューや、コードビューのあちこちから追加できます
> (char型とtable型の不一致を)何か比較できるように変換する方法があるのでしょうか?
table型としてではなく、uniqueid{:,1}として中身(String配列)を取り出せば、char型文字と比較出来ます。
csv_file_path = 'https://jp.mathworks.com/matlabcentral/answers/uploaded_files/1311960/sample.csv';
uniqueid = readtable(csv_file_path,"TextType","string");
uniqueid2 = uniqueid{:,1}; % uniqueid2 = uniqueid(:,1)
Item = 'F'; % app.DropDown.Value;
row = uniqueid2 == Item;
if any(row) % anyが無いとA~F全て存在しない限りif文内部が実行されません
idnum = uniqueid(row,:); % ここもidnum = uniqueid{row,:}と比較してみてください
end
A.T
A.T on 7 Mar 2023
お返事が遅くなり申し訳ありません。
ご丁寧に回答いただきありがとうございました!無事プログラムが動作しました。

Sign in to comment.

More Answers (0)

Categories

Find more on App Designer を使用したアプリ開発 in Help Center and File Exchange

Asked:

A.T
on 2 Mar 2023

Commented:

A.T
on 7 Mar 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!