用于读取前缀整数的Matlab,fread和sscanf

时间:2014-05-12 20:14:39

标签: matlab

我知道此类问题之前已经讨论过很多,但我似乎错过了如何在我的案例中妥善解决它......

我有一些带有数十万行前缀整数的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');

谢谢, 基督教

1 个答案:

答案 0 :(得分:1)

以下是我对sscanf所做的事情。让我们像以前使用fopenfclose一样阅读文本文件。之后,我们可以使用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