将\ t(制表符)分隔的字符转换为新的列向量

时间:2014-02-21 20:45:11

标签: string matlab vector tabs reshape

背景

我有一个十六进制值的char数组,如下所示:

FF23    0008    FF58    00DE    00FC    0008
FF23    0008    FF58    00DF    0012    000C
FF23    0008    FF58    00DD    00F9    000C
FF23    0008    FF58    00DB    00F1    000B
....etc....

分离有\ t(标签)。我设法按下char数组以使换行成为新行(即size(string) = numOfRows, 1)。

我需要将它们放入自己的4列中,以便我可以绘制值。是的,hex2dec是我的目标,但它现在不会处理标签。

问题

鉴于上面的char数组,我如何将每个4个字符组组成各自的列?如果需要,我可以取出标签并使用不同的分隔符。

我的不良尝试

xlsread('C:\somefile', charArray)

这对我不起作用,因为我的计算机上没有Office,只有LibreOffice(http://tinyurl.com/kecqeg6)。

我试过了:

reshape(charArray, length(charArray), 6)

但是这会回来:

??? Error using ==> reshape
To RESHAPE the number of elements must not change.

我理解,但是来吧。 reshape()有点意味着你可以做这些事情。

感谢您的帮助。我很感激。

修改

之前我认为我有一个字符串向量,而不是char数组。我已更新帖子以反映这一点。再次感谢你。

2 个答案:

答案 0 :(得分:1)

这是你想要的吗?

A = ['FF23 0008 FF58 00DE 00FC 0008'
     'FF23 0008 FF58 00DF 0012 000C']; %// example data (char array)

B = regexprep(mat2cell(A,ones(1,size(A,1)),size(A,2)),'\s',''); %// get rid of \t
B = vertcat(B{:}) - '0'; %// turn B into a numeric matrix...
ind = B>=17;
B(ind) = B(ind) - 7; %// ... with values 0--15
B = reshape(permute(B,[2 3 1]),4,[],size(A,1)); %// reshape to make groups of 4
result = squeeze(sum(bsxfun(@times, B, 16.^(3:-1:0).'))).' %// convert each group

使用示例A,这会给出

result =
       65315           8       65368         222         252           8
       65315           8       65368         223          18          12

答案 1 :(得分:0)

将文本文件转换为char数组是不必要的步骤。您可以直接从文本文件中工作。

fid = fopen('test.txt','r');    %read text file
C = textscan(fid,'%s%s%s%s%s%s', 'delimiter',' \t','MultipleDelimsAsOne',1);   % 6 cols of chars
fclose(fid)

D = hex2dec(vertcat(C{:}));     % convert cells in strings, concatenate, then convert in doubles
D = reshape(D, numel(D)/6, 6);  % reshape the matrix