作者celestialgod (天)
看板MATLAB
标题Re: [问题] 请问读取excel资料的一个细节问题
时间Tue Apr 5 20:19:45 2016
※ 引述《mozenpee7 (右京)》之铭言:
: 请问各位前辈,我有一栏excel资料类似
: 1-1
: 2-13
: 10-2
: 105-223
: 10581-4
: 4
: 5
: 78-3
: 请问我有没有可能在读取的时候放入一个矩阵变成两栏类似
: 1 1
: 2 13
: 10 2
: 105 223
: 10581 4
: 4 0
: 5 0
: 78 3
: 主要是一栏里面用dash分开的两个数字
: 我不知道该怎麽读了再分开
: 然後资料又不是每一栏都有dash,好像又提高复杂度了...
: 烦请前辈们指点方向
: 或者其实我只是想要把他们依大小顺序排列(先比前面再比後面)
: 根本不需要这样做?
: 我现在想的是
: 把一栏资料提出--拆成两个数字--两个回圈分别比前後大小--依原格式新顺序输出
: 100.200笔的资料*10,用人眼整理会瞎掉...
假设你的字串存在test.txt这个档案,可以这样写:
fileID = fopen('test.txt','r');
A = textscan(fileID, '%s');
fclose(fileID);
A = A{1};
for i = 1:numel(A)
A{i} = str2double(strsplit(A{i}, '-'));
if numel(A{i}) == 1
A{i} = [A{i}, 0];
end
end
B = cat(1, A{:});
sortrows(B)
ans =
1 1
2 13
4 0
5 0
10 2
78 3
105 223
10581 4
输出档案就
dlmwrite('test2.txt', sortrows(B), 'delimiter', '-')
补充:
你是excel档案的话,假设那串文字存在C2~C9之间,C1是header
那麽用xlsread就可以读入,然後上面程式码稍作修改可以得到一样结果
[~, ~, raw] = xlsread('test.xlsx', 'C2:C9');
for i = 1:numel(raw)
if ischar(raw{i})
raw{i} = str2double(strsplit(raw{i}, '-'));
else
raw{i} = [raw{i}, 0];
end
end
B = cat(1, raw{:});
sortrows(B)
ans =
1 1
2 13
4 0
5 0
10 2
78 3
105 223
10581 4
写回去要再麻烦一点XD
B = sortrows(B);
B_cell = cell(size(B,1), 1);
for i = 1:size(B,1)
B_cell{i} = strjoin(arrayfun(@num2str, B(i, :), 'uni', false), '-');
end
xlswrite('test.xlsx', B_cell, 'C2:C9')
最後,如果是要把原本的row也跟着排列,那麽一开始读入就要整个读入
然後sortrows要output index,再对整个cell更改,再把B_cell做取代的动作
这部分就不示范了,自行摸索吧。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.218.152.118
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/MATLAB/M.1459858789.A.FDA.html
※ 编辑: celestialgod (180.218.152.118), 04/05/2016 20:36:02
1F:推 mozenpee7: 太感谢了!! m(_ _)m 04/06 00:11