我有一个文本文件。
在文件中大约有20,000行数据。每行有一列&包含256个字符(都是数字)。
我需要将每一行拆分成一个单元格数组或矩阵。所以每8个字符是#34;一个字符"信息。我想将前3个字符拆分成一个单元格数组,将接下来的5个字符拆分成一个双精度数,然后再将相同的数字拆分为接下来的8个字符。
example
1653256719812345
myCellArray (1 x 2) myDoubleArray (1 x 2)
[165, 198] [32567, 12345]
这样做的最佳方式是什么?
答案 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
语句中的textscan
,fgetl
}的输出。
通常,每当您发现自己必须读取由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
如果有一些公式化模式,你应该加入它而不是手动硬编码。