Re: [問題] 請問讀取excel資料的一個細節問題
※ 引述《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://www.ptt.cc/bbs/MATLAB/M.1459858789.A.FDA.html
※ 編輯: celestialgod (180.218.152.118), 04/05/2016 20:36:02
推
04/06 00:11, , 1F
04/06 00:11, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
MATLAB 近期熱門文章
PTT數位生活區 即時熱門文章