将字符数组拆分为单元格数组和矩阵

时间:2016-08-22 14:04:24

标签: matlab

我有一个文本文件。

在文件中大约有20,000行数据。每行有一列&包含256个字符(都是数字)。

我需要将每一行拆分成一个单元格数组或矩阵。所以每8个字符是#34;一个字符"信息。我想将前3个字符拆分成一个单元格数组,将接下来的5个字符拆分成一个双精度数,然后再将相同的数字拆分为接下来的8个字符。

 example

 1653256719812345

 myCellArray (1 x 2)     myDoubleArray (1 x 2)
 [165, 198]              [32567, 12345]

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:4)

使用textscan

fid = fopen(MyFileName.txt);
data = textscan(fid, '%3d%5d', 'Delimiter', '');
fclose(fid);

测试:

% Test with string of 256 random digits that all happen to be 1:8 repeated 32 times
x = '1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678';

>> y = textscan(x, '%3d%5d', 'Delimiter', '')
y = 

[32x1 int32]    [32x1 int32]

>> y{1}
ans =

     123
     123
     123
     123
     ...

我不知道文件的确切格式,因此您可能必须在循环内逐行执行此操作(在这种情况下,您将使用fgetl获取每一行,然后替换fid语句中的textscanfgetl}的输出。

通常,每当您发现自己必须读取由FORTRAN代码(固定字段宽度文本文件)生成的数据时,textscan' 'Delimiter, '''Whitespace', ''参数是你的朋友。

答案 1 :(得分:3)

使用regexp。如果文件data.txt包含

1653256719812345
1563256719812345
1233256719812345
1463256719812345

然后以下MATLAB语句将读取数字。

>> txt = fileread('data.txt') % Read entire file in txt
>> out = regexp(txt,'(\d{3})(\d{5})(\d{3})(\d{5})','tokens') % Match regex capturing groups

out = 

{1x4 cell}    {1x4 cell}    {1x4 cell}    {1x4 cell}

out中的每个单元格都是包含已解析数字作为字符串的文件中的一行。您可以使用str2double将数字转换为MATLAB中的数字数据类型

>> nums = cellfun(@str2double,out,'uni',0)

nums = 

[1x4 double]    [1x4 double]    [1x4 double]    [1x4 double]

答案 2 :(得分:0)

逐个迭代您的行并运行类似下面的代码。

k=int2str(1653256719812345);
> myCellArray{1}=k(1:3)

myCellArray = 

    '165'

>> mydoublearray(1)=str2num(k(4:9))

mydoublearray =

      325671

如果有一些公式化模式,你应该加入它而不是手动硬编码。