Matlab 有没有办法只读取输入文件行的一部分?

Matlab 有没有办法只读取输入文件行的一部分?,matlab,file-io,Matlab,File Io,我有一个例程,打开一个查找表文件,在写入文件之前查看某个条目是否已经存在。每行包含大约2500列数据。我需要检查每行的前两列,以确保条目不存在 我不想为了检查两个条目,每行读2500列。我试图使用fscanf函数,但当我尝试只读取2列时,它给了我一个无效大小错误有没有办法只读取输入文件每行的一部分? if(exist(strcat(fileDirectory,fileName),'file')) fileID = fopen(strcat(fileDire

我有一个例程,打开一个查找表文件,在写入文件之前查看某个条目是否已经存在。每行包含大约2500列数据。我需要检查每行的前两列,以确保条目不存在

我不想为了检查两个条目,每行读2500列。我试图使用
fscanf
函数,但当我尝试只读取2列时,它给了我一个
无效大小
错误有没有办法只读取输入文件每行的一部分?

        if(exist(strcat(fileDirectory,fileName),'file'))
            fileID = fopen(strcat(fileDirectory,fileName),'r');
            if(fileID == -1)
                disp('ERROR: Could not open file.\n')
            end  
            % Read file to see if line already exists
            dataCheck = fscanf(fileID, '%f %f', [inf 2]);
            for i=1:length(dataCheck(:,1))
                if(dataCheck(i,1) == sawAnglesDeg(sawCount))
                    if(dataCheck(i,2) == sarjAnglesDeg(floor((sawCount-1)/4)+1))
                        % This line has already been written in lookup table
                        lineExists = true;
                        disp('Duplicate lookup table line found. Skipping...\n')
                        break;
                    end
                end
            end
            fclose(fileID);
        end
嗯,不是真的

您应该能够在循环中执行前两个双精度的fscanf,然后使用fgetl读取行的其余部分,即表单上的:

while there_are_more_lines
   dataCheck = fscanf(fileID, '%f', 2);
   fgetl(fileID); % Read remainder of line, discarding it
   % Do check here for each line
end
因为它是一个文本文件,所以不能真正跳过从文件中读取字符。对于二进制文件,您可以执行fseek,它可以根据字节计数在文件中跳转-如果您确切知道下一行的起始位置(字节计数),则可以使用fseek。但对于文本文件,您不知道这一点,因为每行的长度都会有所不同。如果将数据保存在二进制文件中,则可以执行类似操作

我可能会做的是:创建两个文件,第一个包含两个可以快速读入的“检查值”,另一个包含2500列数据,带或不带两个“检查值”。它们应该同步更新;向第一个文件添加一行时,也会向第二个文件添加一行

我肯定会制作一个checkData矩阵变量,并尽可能长地保存在内存中;在文件中添加新行时,还要更新checkData矩阵,因此您最初只需读取一次文件,并在程序的剩余生命周期中使用checkData矩阵。

嗯,不太可能

您应该能够在循环中执行前两个双精度的fscanf,然后使用fgetl读取行的其余部分,即表单上的:

while there_are_more_lines
   dataCheck = fscanf(fileID, '%f', 2);
   fgetl(fileID); % Read remainder of line, discarding it
   % Do check here for each line
end
因为它是一个文本文件,所以不能真正跳过从文件中读取字符。对于二进制文件,您可以执行fseek,它可以根据字节计数在文件中跳转-如果您确切知道下一行的起始位置(字节计数),则可以使用fseek。但对于文本文件,您不知道这一点,因为每行的长度都会有所不同。如果将数据保存在二进制文件中,则可以执行类似操作

我可能会做的是:创建两个文件,第一个包含两个可以快速读入的“检查值”,另一个包含2500列数据,带或不带两个“检查值”。它们应该同步更新;向第一个文件添加一行时,也会向第二个文件添加一行


我肯定会制作一个checkData矩阵变量,并尽可能长地保存在内存中;在向文件中添加新行时,还要更新checkData矩阵,因此您最初只需读取一次文件,并在程序的剩余生命周期中使用checkData矩阵。

正如@Jesper Grooss所写,没有解决方案可以跳过剩余行而不读取它。在单个文本文件上下文中,最快的解决方案可能包括

  • 使用
    textscan
    读取整个文件(将一行文本放入矩阵的一个单元格元素中)
  • 将新行追加到矩阵,即使它是重复条目
  • 使用
    unique(cellmatrix,'rows')对单元格矩阵进行uniquing
  • 如果新行对应于新条目,则将其追加到文本文件

uniquing步骤取代了假定成本高昂的
for
循环。

正如@Jesper Grooss所写,没有办法跳过行的剩余部分而不读取它。在单个文本文件上下文中,最快的解决方案可能包括

  • 使用
    textscan
    读取整个文件(将一行文本放入矩阵的一个单元格元素中)
  • 将新行追加到矩阵,即使它是重复条目
  • 使用
    unique(cellmatrix,'rows')对单元格矩阵进行uniquing
  • 如果新行对应于新条目,则将其追加到文本文件

uniquing步骤取代了假定昂贵的
for
循环。

使用
textscan
可以跳过字段、部分字段,甚至“行的其余部分”,因此我会这样做(基于MATLAB帮助示例稍微修改):


然后检查
data
(应该是您想要的两列)以查看这些行中是否有任何一行符合要求。

使用
textscan
可以跳过字段、部分字段,甚至“行的其余部分”,因此我会这样做(基于稍微修改的MATLAB帮助示例):


然后检查
数据
(应该是您想要的两列)以查看这些行中是否有任何一行符合要求。

文件中的列是否用空格分隔?是的,它们是用空格分隔的。删除
%f
中的一列无效吗?文档:“按列顺序最多读取m*n个元素。n可以是inf,但m不能。”inf不可能。文件中的列是否用空格分隔?是的,它们是用空格分隔的。删除
%f
中的一个元素无效吗?文档:“按列顺序最多读取m*n个元素。n可以是inf,但m不能。”inf不可能。