逐行读取MATLAB中的文本文件

时间:2010-05-18 10:42:03

标签: file matlab file-io csv

我有一个CSV文件,我想读取这个文件,并在每一行上做一些预计算,看看例如该行对我有用,如果是,我将它保存到一个新的CSV文件。 有人可以举个例子吗? 在更多细节中,这是我的数据的样子:(字符串,浮点数,浮点数)数字是坐标。

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的行。还应复制字符串字段。 感谢

5 个答案:

答案 0 :(得分:9)

您实际上可以使用xlsread来完成此任务。首先将上面的示例数据放在文件'input_file.csv'中之后,这里有一个示例,说明如何从xlsread的三个输出中获取文件中的数值,文本值和原始数据:

>> [numData,textData,rawData] = xlsread('input_file.csv')

numData =     % An array of the numeric values from the file

   51.9358    4.1833
   51.9354    4.1841
   51.9352    4.1846
   51.9343    4.1864
   51.9343    4.1864
   51.9341    4.1869


textData =    % A cell array of strings for the text values from the file

    'ABC'
    'ABC'
    'ABC'
    'ABC'
    'ABC'
    'ABC'


rawData =     % All the data from the file (numeric and text) in a cell array

    'ABC'    [51.9358]    [4.1833]
    'ABC'    [51.9354]    [4.1841]
    'ABC'    [51.9352]    [4.1846]
    'ABC'    [51.9343]    [4.1864]
    'ABC'    [51.9343]    [4.1864]
    'ABC'    [51.9341]    [4.1869]

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

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

答案 1 :(得分:7)

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

  1. 使用fopen
  2. 打开数据文件
  3. 使用fgetl
  4. 将下一行读入字符数组
  5. 使用您刚刚阅读的字符数组上的sscanf检索所需的数据
  6. 执行任何相关测试
  7. 将您想要的内容输出到另一个文件
  8. 如果您尚未到达文件末尾,请返回第2点。
  9. 与之前的答案不同,这与Matlab的风格不同,但在非常大的文件上可能更有效。

    希望这会有所帮助。

答案 2 :(得分:7)

您无法使用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);

答案 3 :(得分:5)

只需在一个块中读入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将数据写入新文件

答案 4 :(得分:3)

这是阅读csv的文档:http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvread.html 并写下:http://www.mathworks.com/access/helpdesk/help/techdoc/ref/csvwrite.html

修改

一个有效的例子:

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

代码:

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)

和输出文件结果:

1,50,4.1
4,71,4.9
5,51,4.5
6,61,4.1

这可能不是最好的解决方案,但它有效!我们可以读取CSV文件,控制每行的距离并将其保存在新文件中。

希望它会有所帮助!