File 在MATLAB中逐行读取文本文件
我有一个CSV文件,我想读取该文件,并对每一行进行一些预计算,以查看该行是否对我有用,如果是,则将其保存到新的CSV文件中。 有人能给我举个例子吗? 更详细地说,这是我的数据的样子:(string,float,float)数字是坐标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
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
检索所需的数据希望这会有所帮助。您不能用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)