Reading from Excel File and

1 次查看(过去 30 天)
Hello,
I am doing a review of MATLAB basics. Attached to this comment is Excel file where it shows the amount of moeny spent from 2015 to 2018.
I want to use for loop(if possible) to print in comand window the total amount spent in 2015,2016,2017,2018 ( as it shows in fprintf). And to have the total amount in all years. Excel file for more details, columns D through H for clarifications.
I have already plot the figures of each year with the money spent. It works fine. Here is my code:
%%
clc
clear
%%
% read table
data = readtable('SpentinUSDollar.xlsx')
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
data = 51×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 23-Aug-2015 5000 1332.5 8528.3 15911 15058 8261.8 47758 09-Sep-2015 1000 266.51 NaN NaN NaN NaN NaN 16-Sep-2015 6000 1599.1 3.7522 NaN NaN NaN NaN 27-Sep-2015 3000 799.53 NaN NaN NaN NaN NaN 01-Oct-2015 3000 799.53 NaN NaN NaN NaN NaN 08-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 18-Oct-2015 6000 1599.1 NaN NaN NaN NaN NaN 25-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 01-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 24-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 09-Dec-2015 3000 799.53 NaN NaN NaN NaN NaN 10-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 13-Jan-2016 2000 533.02 NaN NaN NaN NaN NaN 18-Jan-2016 3500 932.78 NaN NaN NaN NaN NaN 31-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 21-Feb-2016 3500 932.78 NaN NaN NaN NaN NaN
% use year() function to get the year from a datetime array
Udate2015 = year(data{:,1}) == 2015;
% logical indexing to get a sub-table containing data from year 2015
tdate2015 = data(Udate2015,:)
tdate2015 = 11×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 23-Aug-2015 5000 1332.5 8528.3 15911 15058 8261.8 47758 09-Sep-2015 1000 266.51 NaN NaN NaN NaN NaN 16-Sep-2015 6000 1599.1 3.7522 NaN NaN NaN NaN 27-Sep-2015 3000 799.53 NaN NaN NaN NaN NaN 01-Oct-2015 3000 799.53 NaN NaN NaN NaN NaN 08-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 18-Oct-2015 6000 1599.1 NaN NaN NaN NaN NaN 25-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 01-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 24-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 09-Dec-2015 3000 799.53 NaN NaN NaN NaN NaN
% use year() function to get the year from a datetime array
Udate2015 = year(data{:,1}) == 2015;
% logical indexing to get a sub-table containing data from year 2015
tdate2015 = data(Udate2015,:)
tdate2015 = 11×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 23-Aug-2015 5000 1332.5 8528.3 15911 15058 8261.8 47758 09-Sep-2015 1000 266.51 NaN NaN NaN NaN NaN 16-Sep-2015 6000 1599.1 3.7522 NaN NaN NaN NaN 27-Sep-2015 3000 799.53 NaN NaN NaN NaN NaN 01-Oct-2015 3000 799.53 NaN NaN NaN NaN NaN 08-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 18-Oct-2015 6000 1599.1 NaN NaN NaN NaN NaN 25-Oct-2015 1000 266.51 NaN NaN NaN NaN NaN 01-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 24-Nov-2015 3000 799.53 NaN NaN NaN NaN NaN 09-Dec-2015 3000 799.53 NaN NaN NaN NaN NaN
%%
Udate2016 = year(data{:,1}) == 2016;
% logical indexing to get a sub-table containing data from year 2015
tdate2016 = data(Udate2016,:)
tdate2016 = 20×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 10-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 13-Jan-2016 2000 533.02 NaN NaN NaN NaN NaN 18-Jan-2016 3500 932.78 NaN NaN NaN NaN NaN 31-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 21-Feb-2016 3500 932.78 NaN NaN NaN NaN NaN 13-Mar-2016 3500 932.78 NaN NaN NaN NaN NaN 01-May-2016 3500 932.78 NaN NaN NaN NaN NaN 08-May-2016 3000 799.53 NaN NaN NaN NaN NaN 01-Jun-2016 3000 799.53 NaN NaN NaN NaN NaN 13-Jun-2016 2000 533.02 NaN NaN NaN NaN NaN 03-Jul-2016 3500 932.78 NaN NaN NaN NaN NaN 10-Jul-2016 1000 266.51 NaN NaN NaN NaN NaN 24-Jul-2016 3000 799.53 NaN NaN NaN NaN NaN 28-Aug-2016 1000 266.51 NaN NaN NaN NaN NaN 04-Sep-2016 6500 1732.3 NaN NaN NaN NaN NaN 27-Sep-2016 3500 932.78 NaN NaN NaN NaN NaN
% use year() function to get the year from a datetime array
Udate2016 = year(data{:,1}) == 2016;
% logical indexing to get a sub-table containing data from year 2015
tdate2016 = data(Udate2016,:)
tdate2016 = 20×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 10-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 13-Jan-2016 2000 533.02 NaN NaN NaN NaN NaN 18-Jan-2016 3500 932.78 NaN NaN NaN NaN NaN 31-Jan-2016 1500 399.76 NaN NaN NaN NaN NaN 21-Feb-2016 3500 932.78 NaN NaN NaN NaN NaN 13-Mar-2016 3500 932.78 NaN NaN NaN NaN NaN 01-May-2016 3500 932.78 NaN NaN NaN NaN NaN 08-May-2016 3000 799.53 NaN NaN NaN NaN NaN 01-Jun-2016 3000 799.53 NaN NaN NaN NaN NaN 13-Jun-2016 2000 533.02 NaN NaN NaN NaN NaN 03-Jul-2016 3500 932.78 NaN NaN NaN NaN NaN 10-Jul-2016 1000 266.51 NaN NaN NaN NaN NaN 24-Jul-2016 3000 799.53 NaN NaN NaN NaN NaN 28-Aug-2016 1000 266.51 NaN NaN NaN NaN NaN 04-Sep-2016 6500 1732.3 NaN NaN NaN NaN NaN 27-Sep-2016 3500 932.78 NaN NaN NaN NaN NaN
%%
Udate2017 = year(data{:,1}) == 2017;
% logical indexing to get a sub-table containing data from year 2015
tdate2017 = data(Udate2017,:)
tdate2017 = 13×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 23-Jan-2017 5000 1332.5 NaN NaN NaN NaN NaN 12-Feb-2017 2000 533.02 NaN NaN NaN NaN NaN 28-Feb-2017 3500 932.78 NaN NaN NaN NaN NaN 30-Mar-2017 4500 1199.3 NaN NaN NaN NaN NaN 30-Apr-2017 5000 1332.5 NaN NaN NaN NaN NaN 29-May-2017 5000 1332.5 NaN NaN NaN NaN NaN 27-Jun-2017 4500 1199.3 NaN NaN NaN NaN NaN 30-Jul-2017 6000 1599.1 NaN NaN NaN NaN NaN 29-Aug-2017 7000 1865.6 NaN NaN NaN NaN NaN 10-Sep-2017 4000 1066 NaN NaN NaN NaN NaN 03-Oct-2017 3000 799.53 NaN NaN NaN NaN NaN 29-Oct-2017 3000 799.53 NaN NaN NaN NaN NaN 18-Dec-2017 4000 1066 NaN NaN NaN NaN NaN
% use year() function to get the year from a datetime array
Udate2017 = year(data{:,1}) == 2017;
% logical indexing to get a sub-table containing data from year 2015
tdate2017 = data(Udate2017,:)
tdate2017 = 13×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 23-Jan-2017 5000 1332.5 NaN NaN NaN NaN NaN 12-Feb-2017 2000 533.02 NaN NaN NaN NaN NaN 28-Feb-2017 3500 932.78 NaN NaN NaN NaN NaN 30-Mar-2017 4500 1199.3 NaN NaN NaN NaN NaN 30-Apr-2017 5000 1332.5 NaN NaN NaN NaN NaN 29-May-2017 5000 1332.5 NaN NaN NaN NaN NaN 27-Jun-2017 4500 1199.3 NaN NaN NaN NaN NaN 30-Jul-2017 6000 1599.1 NaN NaN NaN NaN NaN 29-Aug-2017 7000 1865.6 NaN NaN NaN NaN NaN 10-Sep-2017 4000 1066 NaN NaN NaN NaN NaN 03-Oct-2017 3000 799.53 NaN NaN NaN NaN NaN 29-Oct-2017 3000 799.53 NaN NaN NaN NaN NaN 18-Dec-2017 4000 1066 NaN NaN NaN NaN NaN
%%
Udate2018 = year(data{:,1}) == 2018;
% logical indexing to get a sub-table containing data from year 2015
tdate2018 = data(Udate2018,:)
tdate2018 = 7×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 03-Jan-2018 5000 1332.5 NaN NaN NaN NaN NaN 19-Feb-2018 4000 1066 NaN NaN NaN NaN NaN 13-Mar-2018 3000 799.53 NaN NaN NaN NaN NaN 18-Apr-2018 5000 1332.5 NaN NaN NaN NaN NaN 08-May-2018 5000 1332.5 NaN NaN NaN NaN NaN 21-May-2018 3000 799.53 NaN NaN NaN NaN NaN 10-Jul-2018 6000 1599.1 NaN NaN NaN NaN NaN
% use year() function to get the year from a datetime array
Udate2018 = year(data{:,1}) == 2018;
% logical indexing to get a sub-table containing data from year 2015
tdate2018 = data(Udate2018,:)
tdate2018 = 7×8 table
Date SAR USDollar TotalOf2015 TotalOf2016 TotalOf2017 TotalOf2018 TotalOfAllYears ___________ ____ ________ ___________ ___________ ___________ ___________ _______________ 03-Jan-2018 5000 1332.5 NaN NaN NaN NaN NaN 19-Feb-2018 4000 1066 NaN NaN NaN NaN NaN 13-Mar-2018 3000 799.53 NaN NaN NaN NaN NaN 18-Apr-2018 5000 1332.5 NaN NaN NaN NaN NaN 08-May-2018 5000 1332.5 NaN NaN NaN NaN NaN 21-May-2018 3000 799.53 NaN NaN NaN NaN NaN 10-Jul-2018 6000 1599.1 NaN NaN NaN NaN NaN
%% the issue is from here to fprintf
year = 0;
for i = 1:size(data,1)
if strcmp(cell2mat(data(i,4)),year)
year = year+1
end
end
Error using cell2mat
Subscripting into a table using one subscript (as in t(i)) is not supported. Specify a row subscript and a variable subscript, as in t(rows,vars). To select variables, use t(:,i) or for one variable t.(i). To select rows, use
t(i,:).
fprintf(' The total spent money in %d is %s\n',data,year(data{:,1}))
fprintf(' The total of spent money of all years is %0.1f',data,total(i))
%%Anything below plot works fine.
%% plot
figure
subplot(2,2,1)
plot(tdate2015{:,1},tdate2015{:,3},'g-','Linewidth',1.8)
title('Monthly Stipend 2015')
xlabel('Date')
ylabel(' $ US Dollar')
grid on
%%
subplot(2,2,2)
plot(tdate2016{:,1},tdate2016{:,3},'b-','Linewidth',1.8)
title('Monthly Stipend 2016')
xlabel('Date')
ylabel(' $ US Dollar')
grid on
%%
subplot(2,2,3)
plot(tdate2017{:,1},tdate2017{:,3},'k-','Linewidth',1.8)
title('Monthly Stipend 2017')
xlabel('Date')
ylabel(' $ US Dollar')
grid on
%%
subplot(2,2,4)
plot(tdate2018{:,1},tdate2018{:,3},'r-','Linewidth',1.8)
title('Monthly Stipend 2018')
xlabel('Date')
ylabel(' $ US Dollar')
grid on

采纳的回答

Voss
Voss 2022-4-20
data = readtable('SpentinUSDollar.xlsx');
Warning: Column headers from the file were modified to make them valid MATLAB identifiers before creating variable names for the table. The original column headers are saved in the VariableDescriptions property.
Set 'VariableNamingRule' to 'preserve' to use the original column headers as table variable names.
% remove extra columns from table:
data(:,4:end) = [];
% get the set of relevant years:
all_years = year(data{:,1});
% get the set of unique years to loop over:
u_years = unique(all_years);
n_years = numel(u_years);
% initialize yearly totals:
total_year = zeros(n_years,1);
% loop over unique years:
for ii = 1:n_years
% total for each year:
total_year(ii) = sum(data{all_years == u_years(ii),3});
fprintf(' The total spent money in %d is $%.2f\n',u_years(ii),total_year(ii))
end
The total spent money in 2015 is $9327.80 The total spent money in 2016 is $15910.56 The total spent money in 2017 is $15057.73 The total spent money in 2018 is $8261.76
% total for all years
total_all_years = sum(data{:,3});
fprintf(' The total of spent money of all years is $%.2f',total_all_years);
The total of spent money of all years is $48557.84

更多回答(0 个)

Community Treasure Hunt

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

Start Hunting!

Translated by