Stata总是整不明白而且如果后续还想加新的数据列,还得单独用Stata转换,再合并挺麻烦的。于是希望用Matlab直接转成面板数据,然后直接复制粘贴,就方便得多。
函数无参数则默认选中的文件中所有的工作簿都转换
有参数的话,第一参数是工作簿名字,第二个参数是年份范围
如图所示
先选择转换的文件,可以是csv,xls,xlsx
转成
可以支持一个文件里多个工作簿的转换
原始数据格式要求:第一列是省名,第一行是年份,年份至少要保证有数值,可以是如2022,可以是2022年。
注意:省名要自己先排好序,要保证每个工作簿的省份顺序要一样。
贴上代码,萌新代码,多多包涵,帮助到你了的话,麻烦给个赞嗷,感谢。
function Processing_Panel(varargin)
%%%如果不写入参数,就是选中文件的所有工作簿
%%%第一个参数为选定的工作簿
%%%第二个参数为年份范围的数组
%%%
warning off
[file,path] = uigetfile({'*.*';'*.csv';'*.xls';'*.xlsx'},'请选择文件夹','MultiSelect', 'on');
file = cellstr(file);
for ii = 1:length(file)
file_path = [path,file{ii}];
if isempty(varargin)
[~, Sheet]=xlsfinfo(file_path);
else
Sheet = varargin(1);
year_lim = varargin{2};
end
for iii = 1:length(Sheet)
try
[~,~,dataset] = xlsread(file_path,Sheet{iii});
province = dataset(2:end,1);
year_s = dataset(1,2:end);
year = [];
for i = 1:length(year_s)
a = year_s{i};
if ischar(a)
b=a(isstrprop(a,'digit'));
year = [year str2double(b)];
else
year = [year a];
end
end
[year, ind] = sort(year);
data = dataset(2:end,2:end);
data = cell2mat(data);
data = data(:,ind);
if ~isempty(varargin)
d = [];
if year_lim
for i = 1: length(year)
if ~ismember(year(i),year_lim)
d = [d i];
end
end
end
year(d)=[];
data(:,d)=[];
end
data_new = {};
for i = 1:length(province)
temp = {};
temp(1:length(year),1)=province(i);
temp(1:length(year),2)=num2cell(ones(1,length(year))*i);
temp(1:length(year),3)=num2cell(year');
temp(1:length(year),4)=num2cell(data(i,:)');
data_new = [data_new;temp];
end
new_name = ['处理_' file{ii}];
writecell(data_new,[path new_name],'Sheet',Sheet{iii});
catch
fprintf("%s 的 %s 工作簿转换失败",file{ii},Sheet{iii});
continue
end
end
end