Matlab Textscan和Regexp单元格数据布局

Matlab Textscan和Regexp单元格数据布局,matlab,Matlab,我试图用一些遗留的matlab代码来实现一些逻辑。我认为最简单的事情是使数据看起来与代码所期望的一样 我从一个CSV文件中读取相关数据,这很简单——但是ID的格式从一个简单的数字变成了[YY,ZZZZ]形式的ID 例如,“以前的”CSV数据如下所示: 1,Simple,Data 2,More,Data-Dash-Data 3,Even,More 4,Really,More “新”CSV数据如下所示: [01,0001],Simple,Data [02,1001],More,Data-Dash-

我试图用一些遗留的matlab代码来实现一些逻辑。我认为最简单的事情是使数据看起来与代码所期望的一样

我从一个CSV文件中读取相关数据,这很简单——但是ID的格式从一个简单的数字变成了[YY,ZZZZ]形式的ID

例如,“以前的”CSV数据如下所示:

1,Simple,Data
2,More,Data-Dash-Data
3,Even,More
4,Really,More
“新”CSV数据如下所示:

[01,0001],Simple,Data
[02,1001],More,Data-Dash-Data
[03,9876],Even,More
[04,1234],Really,More
以前,为了读取数据,使用了以下逻辑:

 fid = fopen(fileName);
 data = textscan(fid,'%s%s%s%*s','Delimiter',',');
当针对“先前”CSV数据执行此操作时,它返回的数据如下所示:

data =
  1×3 cell array
    {4×1 cell}    {4×1 cell}    {4×1 cell} 
K>> data

data =

  4×1 cell array

    {1×3 cell}
    {1×3 cell}
    {1×3 cell}
    {1×3 cell}

K>> data{:}

ans =

  1×3 cell array

    '[01,0001]'    'Simple'    'Data'


ans =

  1×3 cell array

    '[02,1001]'    'More'    'Data-Dash-Data'


ans =

  1×3 cell array

    '[03,9876]'    'Even'    'More'


ans =

  1×3 cell array

    '[04,1234]'    'Really'    'More'
这些细胞看起来像:

K>> data{:}

ans =

  4×1 cell array

    '1'
    '2'
    '3'
    '4'


ans =

  4×1 cell array

    'Simple'
    'More'
    'Even'
    'Data'


ans =

  4×1 cell array

    'Data'
    'Data-Dash-Data'
    'More'
    'Data'
因此,为了处理表单[YY,ZZZZ]的ID,我必须修改“textscan”逻辑来处理我们正在使用的新ID格式。为此,我使用了一个regexp函数:

fid = fopen(fileName);
rawData = textscan(fid,'%s','Delimiter','\n');
data = regexp(rawData{1},'[ \-\/\w]*([\[][^\)\]]*[\]])?', 'match')
然后,在读入数据后,它将为我提供如下格式的数据:

data =
  1×3 cell array
    {4×1 cell}    {4×1 cell}    {4×1 cell} 
K>> data

data =

  4×1 cell array

    {1×3 cell}
    {1×3 cell}
    {1×3 cell}
    {1×3 cell}

K>> data{:}

ans =

  1×3 cell array

    '[01,0001]'    'Simple'    'Data'


ans =

  1×3 cell array

    '[02,1001]'    'More'    'Data-Dash-Data'


ans =

  1×3 cell array

    '[03,9876]'    'Even'    'More'


ans =

  1×3 cell array

    '[04,1234]'    'Really'    'More'
因此,您可以看到其中包含正确的数据——但是数据的布局不同,这破坏了遗留代码。因此,我的问题是,当“文本扫描”逻辑产生“新”数据时,我如何才能使其像这样排列:

data =
  1×3 cell array
    {4×1 cell}    {4×1 cell}    {4×1 cell}  
您可以使用直接读取原始文件。之后,您可以使用一个正则表达式,它可以在逗号上拆分,后面不跟数字,也可以在回车上拆分

c = regexp(fileread(fileName),',(?!\d)|\r\n','split');
formattedData = {c(1:3:end)',c(2:3:end)',c(3:3:end)'};

>> formattedData

formattedData =

  1×3 cell array

    {4×1 cell}    {4×1 cell}    {4×1 cell}