Matlab Textscan和Regexp单元格数据布局
我试图用一些遗留的matlab代码来实现一些逻辑。我认为最简单的事情是使数据看起来与代码所期望的一样 我从一个CSV文件中读取相关数据,这很简单——但是ID的格式从一个简单的数字变成了[YY,ZZZZ]形式的ID 例如,“以前的”CSV数据如下所示: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-
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}