我知道此类问题之前已经讨论过很多,但我似乎错过了如何在我的案例中妥善解决它......
我有一些带有数十万行前缀整数的txt文件。每行有3个整数,每个整数都有一个前缀为单个字符A,B或C,如下所示:
A25723B520C4
A25732B477C4
A25742B432C5
A25752B385C10
A25763B340C10
我想让Matlab将整个txt文件读入内存并使用sscanf
为我提供一个矩阵,其中包含3列和txt文件中的行数。
如果我使用textscan
(虽然它给了我一个单元格数组),我已经工作了,但我想看看sscanf
是否可能更快一些 - 但是,我可以好像从sscanf
得到了正确的输出。在这种情况下,有人可以告诉我如何编写基于sscanf
的实现吗?
基于textscan
:
fid=fopen('sampleData.txt','r');
s = fread(fid,'*char')';
fclose(fid);
data = textscan(s,'%*c %d %*c %d %*c %d');
谢谢, 基督教
答案 0 :(得分:1)
以下是我对sscanf
所做的事情。让我们像以前使用fopen
和fclose
一样阅读文本文件。之后,我们可以使用sscanf
来查找6个令牌序列:
一个字符,后跟一个数字,后跟一个字符,后跟一个数字,后跟一个字符,然后再跟一个数字。
根据您上面给出的示例,这是您使用sscanf
进行的操作。
data = sscanf(s, '%c%d%c%d%c%d\n');
我们最后需要\n
分隔符,因为有一个新行分隔每行数据。现在,如果您显示data
,则显示如下:
data =
65
25723
66
520
67
4
65
25732
66
477
67
4
65
25742
66
432
67
5
65
25752
66
385
67
10
65
25763
66
340
67
10
您将看到字符(A,B或C)已转换为其ASCII等效字符。但是,这些数字已成功解析。按照文本文件中的约定,您会看到A,B或C之后的数字落在文本文件的偶数位置。例如,A号码从位置2开始,你需要跳过超过6来转到A的下一个号码,因为我们在一行中读了6件事。对于B编号,我们从位置4开始,对于C编号,我们从位置6开始。
因此,这是我分割数据的方式,最后将所有数字放在一个矩阵中。
lengthData = length(data);
Acol = data(2:6:lengthData);
Bcol = data(4:6:lengthData);
Ccol = data(6:6:lengthData);
dataMatrix = [Acol Bcol Ccol];
......这就是我得到的:
dataMatrix =
25723 520 4
25732 477 4
25742 432 5
25752 385 10
25763 340 10