File 在MATLAB中逐行读取文本文件

File 在MATLAB中逐行读取文本文件,file,matlab,file-io,csv,File,Matlab,File Io,Csv,我有一个CSV文件,我想读取该文件,并对每一行进行一些预计算,以查看该行是否对我有用,如果是,则将其保存到新的CSV文件中。 有人能给我举个例子吗? 更详细地说,这是我的数据的样子:(string,float,float)数字是坐标 ABC,51.9358183333333,4.183255 ABC,51.9353866666667,4.1841 ABC,51.9351716666667,4.184565 ABC,51.9343083333333,4.186425 ABC,51.93430833

我有一个CSV文件,我想读取该文件,并对每一行进行一些预计算,以查看该行是否对我有用,如果是,则将其保存到新的CSV文件中。 有人能给我举个例子吗? 更详细地说,这是我的数据的样子:(string,float,float)数字是坐标

ABC,51.9358183333333,4.183255
ABC,51.9353866666667,4.1841
ABC,51.9351716666667,4.184565
ABC,51.9343083333333,4.186425
ABC,51.9343083333333,4.186425
ABC,51.9340916666667,4.18688333333333
基本上,我想将距离大于50或50的行保存在一个新文件中。字符串字段也应该被复制。
谢谢

以下是阅读csv的文档: 并写下:

编辑

一个有效的例子:

file.csv:

1,50,4.1 2,49,4.2 3,30,4.1 4,71,4.9 5,51,4.5 6,61,4.1 1,50,4.1 2,49,4.2 3,30,4.1 4,71,4.9 5,51,4.5 6,61,4.1 守则:

File = csvread('file.csv') [m,n] = size(File) index=1 temp=0 for i = 1:m if (File(i,2)>=50) temp = temp + 1 end end Matrix = zeros(temp, 3) for j = 1:m if (File(j,2)>=50) Matrix(index,1) = File(j,1) Matrix(index,2) = File(j,2) Matrix(index,3) = File(j,3) index = index + 1 end end csvwrite('outputFile.csv',Matrix) File=csvread('File.csv') [m,n]=大小(文件) 索引=1 温度=0 对于i=1:m 如果(文件(i,2)>=50) 温度=温度+1 结束 结束 矩阵=零(温度,3) 对于j=1:m 如果(文件(j,2)>=50) 矩阵(索引,1)=文件(j,1) 矩阵(索引,2)=文件(j,2) 矩阵(索引,3)=文件(j,3) 索引=索引+1 结束 结束 csvwrite('outputFile.csv',矩阵) 以及输出文件结果:

1,50,4.1 4,71,4.9 5,51,4.5 6,61,4.1 1,50,4.1 4,71,4.9 5,51,4.5 6,61,4.1 这可能不是最好的解决方案,但它确实有效!我们可以读取CSV文件,控制每行的距离,并将其保存在新文件中


希望这会有帮助

如果您确实想逐行处理文件,解决方案可能是使用
fgetl

  • 使用
    fopen打开数据文件
  • 使用
    fgetl
  • 使用刚刚读取的字符数组上的
    sscanf
    检索所需的数据
  • 执行任何相关测试
  • 将所需内容输出到另一个文件
  • 如果您尚未到达文件末尾,请返回第2点
  • 与前面的答案不同,这与Matlab的风格不太一样,但在非常大的文件上可能更有效


    希望这会有所帮助。

    您不能用csvread读取文本字符串。 下面是另一个解决方案:

    fid1 = fopen('test.csv','r'); %# open csv file for reading
    fid2 = fopen('new.csv','w'); %# open new csv file
    while ~feof(fid1)
        line = fgets(fid1); %# read line by line
        A = sscanf(line,'%*[^,],%f,%f'); %# sscanf can read only numeric data :(
        if A(2)<4.185 %# test the values
            fprintf(fid2,'%s',line); %# write the line to the new file
        end
    end
    fclose(fid1);
    fclose(fid2);
    
    fid1=fopen('test.csv','r');%打开csv文件进行读取
    fid2=fopen('new.csv','w');%打开新的csv文件
    而~feof(fid1)
    直线=fgets(fid1);%#逐行阅读
    A=sscanf(第,'%*[^,],%f,%f');%sscanf只能读取数字数据:(
    如果A(2)您实际上可以使用来完成此操作。首先将上面的示例数据放入一个文件
    'input\u file.csv'
    ,下面是一个示例,说明如何从以下三个输出中获取文件中的数值、文本值和原始数据:

    然后,您可以对数值数据执行任何需要的处理,然后使用将数据行的子集重新保存到新文件中。以下是一个示例:

    index = sqrt(sum(numData.^2,2)) >= 50;  % Find the rows where the point is
                                            %   at a distance of 50 or greater
                                            %   from the origin
    xlswrite('output_file.csv',rawData(index,:));  % Write those rows to a new file
    

    只需在一个模块中将其读入MATLAB即可

    fid = fopen('file.csv');
    data=textscan(fid,'%s %f %f','delimiter',',');
    fclose(fid);
    
    然后,您可以使用逻辑寻址来处理它

    ind50 = data{2}>=50 ;
    
    ind50是第2列大于50的行的索引

    data{1}(ind50)
    
    将列出感兴趣行的所有字符串。
    然后只需使用
    fprintf
    将数据写入文档中的新文件

    :“
    csvread
    将在将来的版本中删除。请改用
    dlmread
    。”不幸的是,csvread不读取字符。如果只是数字就可以了。但是,如果只是数字,则不需要所有循环,只需要File=csvread('File.csv');csvwrite('outputFile.csv',File(File(:,2)>=50,:);逻辑寻址将拉出第2列>=50的所有行。听起来它似乎不处理引号、换行符等。就像您期望的CSV函数一样。请参阅CSV RFC:对于这种情况,我将使用
    awk
    而不是Matlab@Adrien-我同意:awk'BEGIN{FS=“,”}$2>=50{print$0}"产出。csv@Arun:是的,它只需填写
    NaN
    ,填写缺少的数值,填写
    '
    ,填写缺少的文本。谢谢您的回复。当我尝试此操作时,我实际收到一个错误,即.xls文件的格式不正确。但是,我将dlmread与原始文本文件一起使用,并且所有操作都正常。@Arun:没有看到您的文件的内容看起来,恐怕我无能为力。不过,很高兴你在中找到了解决方案。
    data{1}(ind50)