将单元格转换为包含文本的矩阵?

时间:2014-11-04 17:56:21

标签: matlab matrix text-processing cell-array textscan

我有包含测量数据的文本文件,标题不重要所以我用它来删除前25行

% Skip the first 25 lines
for i=1:25
fgetl(inputfile);
end

然后我使用分隔符来获取数据

   delimiter = '';
   values = textscan(inputfile, '%s', 'delimiter', delimiter);

我正在尝试转换由1000个字符组成的单元格,如下所示。 我在这里得到了什么

'2014_11_03_17-19-49 000 430114 516672 960.91 26.2'
'2014_11_03_17-19-49 001 430112 516656 960.91 26.2'
'2014_11_03_17-19-49 002 430112 516656 960.91 26.2'
'2014_11_03_17-19-49 003 430112 516656 960.91 26.2'

我正在尝试转换包含1000个字符的单元格,就像之前我只关注(960.91和26.2)值一样。

我尝试将其转换为矩阵,但我得到了

  

此错误不支持包含单元格数组或对象的单元格数组。

知道如何将这些值放入矩阵中绘制它们。

2 个答案:

答案 0 :(得分:1)

使用textscan 'HeaderLines' option的其他格式说明符直接跳过标题:

>> fid = fopen('testtext.txt','r','HeaderLines',25)
>> C = textscan(fid,'%s %d %d %d %f %f')
C = 
    {4x1 cell}   [4x1 int32]   [4x1 int32]   [4x1 int32]   [4x1 double]   [4x1 double]
>> fclose(fid);
>> C{5}

  960.9100
  960.9100
  960.9100
  960.9100

通过连接制作一个矩阵,如果你想这样:

>> M =[C{5} C{6}]
M =

  960.9100   26.2000
  960.9100   26.2000
  960.9100   26.2000
  960.9100   26.2000

您甚至可以指定忽略除所需输出之外的所有输出:

C = textscan(fid,'%*s %*d %*d %*d %f %*f')
C = 
    [4x1 double]

如果丢失了手柄,请不要忘记fclose(fid)fclose all

答案 1 :(得分:1)

方法#1

您可以在这里使用漂亮的 importdata -

lines_skip = 25;
values = importdata(inputfile,' ',lines_skip) %// using the delimiter ' ' here

values将是一个包含inputfile数据的结构。

因此,fourth column将是values.data(:,4),而values.data(:,5)将是fifth,如此处所示 -

>> values.data(:,4)
ans =
  960.9100
  960.9100
  960.9100
  960.9100
>> values.data(:,5)
ans =
   26.2000
   26.2000
   26.2000
   26.2000

方法#2

如果您已经有问题中列出的单元格数组,则无需担心再次读取输入文件。所以,你有类似的东西 -

incell = {
    '2014_11_03_17-19-49 000 430114 516672 960.91 26.2'
    '2014_11_03_17-19-49 001 430112 516656 960.91 26.2'
    '2014_11_03_17-19-49 002 430112 516656 960.91 26.2'
    '2014_11_03_17-19-49 003 430112 516656 960.91 26.2'}

接下来,您可以cellfunregexp一起使用分隔符' '将每个单元格拆分为列 -

cellarr = cellfun(@(x) regexp(x,' ','Split'),incell,'un',0)
values = vertcat(cellarr{:})

会得到你 -

values = 
    '2014_11_03_17-19-49'    '000'    '430114'    '516672'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '001'    '430112'    '516656'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '002'    '430112'    '516656'    '960.91'    '26.2'
    '2014_11_03_17-19-49'    '003'    '430112'    '516656'    '960.91'    '26.2'

也就是说,来自values的第五和第六列将是您在str2double周围包裹str2double(values(:,5))之后要查看的数据:str2double(values(:,6))和{{1}}。