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

Matlab 将字符数组拆分为单元格数组和矩阵,matlab,Matlab,我有一个文本文件 文件中大约有20000行数据。每行有一列&包含256个字符(都是数字) 我需要将每一行分割成一个单元格数组或矩阵。因此,每8个字符都是“一条”信息。我想将前3个字符分割成一个单元格数组,然后将接下来的5个字符分割成一个双精度数组,然后对接下来的8个字符进行同样的分割 example 1653256719812345 myCellArray (1 x 2) myDoubleArray (1 x 2) [165, 198] [32567

我有一个文本文件

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

我需要将每一行分割成一个单元格数组或矩阵。因此,每8个字符都是“一条”信息。我想将前3个字符分割成一个单元格数组,然后将接下来的5个字符分割成一个双精度数组,然后对接下来的8个字符进行同样的分割

 example

 1653256719812345

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

执行此操作的最佳方法是什么?

逐个迭代您的行,然后运行以下代码

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

myCellArray = 

    '165'

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

mydoublearray =

      325671
如果有一些公式化的模式,你应该合并它,而不是手动硬编码。

使用

测试:

% 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
获取每一行,然后用
fgetl
的输出替换
textscan
语句中的
fid


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

使用
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]

您提供的示例显示了16个字符,但您只提供了8个字符的外观。预期的输出格式是什么?它是一个二维矩阵还是一个由数字组成的单元数组,我们看到3个数字,然后是5个数字,然后是3个数字,然后是5个数字……等等?抱歉,我刚刚意识到我的输出不是很清楚。因此,在上面的示例更新中,您可以看到有两个数组,1 x 2和另一个1 x 2。如果有50行,每列16个字符长,则两个矩阵将为50 x 2。如果列增加到32个字符,则矩阵将为50 x 4使用
regexp
可以避免迭代。提供的数据实际上是作为20000 x 1单元格输入的。当我做下一行时,它返回一个1 x 2的空单元格,假设我做错了什么?x=文本扫描(y,“%3d%5d”);有两种可能。首先,您跳过了
“分隔符”部分。在这里的例子中,MATLAB只取前8个字符,然后转到下一个分隔符字符,即行的末尾。第二,你需要传递文本。所以如果你进入一个牢房,你将一无所获。您需要传入
y{1}
以获取文本数组。如果单元格数组的元素已经是数字,那么这根本不起作用,您需要重写您的问题,因为这是一个完全不同的问题。只是添加了“分隔符”,“部分仍然相同”。数据来自一个20000 x 1的单元格。然后我将单元格数组转换为20000 x 256的字符数组。然后我尝试x=textscan(geo,'%3d%5d','Delimiter','';这仍然是错误的吗?我们正在进入这样一个领域:我没有你的数据,这使得我很难调试你的代码。您必须阅读
texscan
帮助页面,然后自己尝试一些不同的方法。例如,does
x=textscan(geo(1,:),'%3d%5d','Delimiter',''工作以仅读取第一行?如果是这样的话,那么换行符会把你搞得一团糟,你可能需要做一个循环,分别阅读每一行。你确定你的数据都是数字吗?如果有任何字母或无法打印的字符,那也会把事情搞得一团糟来自我上面的代码,它应该模拟数据的前4行,并将其插入
textscan
中,工作正常。唯一的诀窍是它按行读取数据,因此如果我插入
X
X'
,我会得到不同的答案。一定要确保你的答案是正确的。
>> nums = cellfun(@str2double,out,'uni',0)

nums = 

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