matlab基本操作读取csv文件.docx
《matlab基本操作读取csv文件.docx》由会员分享,可在线阅读,更多相关《matlab基本操作读取csv文件.docx(8页珍藏版)》请在冰豆网上搜索。
![matlab基本操作读取csv文件.docx](https://file1.bdocx.com/fileroot1/2022-12/15/ed5979a3-3b41-489f-9bbb-d1318126632d/ed5979a3-3b41-489f-9bbb-d1318126632d1.gif)
matlab基本操作读取csv文件
1、用csvread函数
注意:
csvread函数只试用与用逗号分隔的纯数字文件
第一种:
M=CSVREAD('FILENAME') ,直接读取csv文件的数据,并返回给M
第二种:
M=CSVREAD('FILENAME',R,C) ,读取csv文件中从第R-1行,第C-1列的数据开始的数据,这对带有头文件说明的csv文件(如示波器等采集的文件)的读取是很重要的。
第三种:
M=CSVREAD('FILENAME',R,C,RNG),其中 RNG=[R1C1R2C2],读取左上角为索引为(R1,C1),右下角索引为(R2,C2)的矩阵中的数据。
注意:
matlab认为CSV第1行第1列的单元格坐标为(0,0)
给定一个csvlist.csv文件,其内容如下
02,04,06,08,10,12
03,06,09,12,15,18
05,10,15,20,25,30
07,14,21,28,35,42
11,22,33,44,55,66
例1.1 读取整个文件
csvread('csvlist.csv')
ans=
2 4 6 8 10 12
3 6 9 12 15 18
5 10 15 20 25 30
7 14 21 28 35 42
11 22 33 44 55 66
例1.2 读取第2行以下,第0列以右区域的数据
m=csvread('csvlist.dat',2,0)
m=
5 10 15 20 25 30
7 14 21 28 35 42
11 22 33 44 55 66
例1.3 读取第2行以下,第0列以右,第3行以上,第3列以左区域的数据
m=csvread('csvlist.dat',2,0,[2,0,3,3])
m=
5 10 15 20
7 14 21 28
2、使用textscan函数
在使用textscan函数前必须用fopen函数打开CSV文件。
textscan函数读取的结果会存在cell数组中。
调用格式
C=textscan(fid,'format')
C=textscan(fid,'format',N)
C=textscan(fid,'format',param,value,...)
C=textscan(fid,'format',N,param,value,...)
C=textscan(str,...)
[C,position]=textscan(...)
关于textscan函数的具体用法见helptextscan。
例2.1 读取字符串
str='0.418.243.576.249.27';
C=textscan(str,'%3.1f%*1d');
textscanreturnsa1-by-1cellarrayC:
C{1}=[0.4;8.2;3.5;6.2;9.2]
例2.2 读取不同类型的数据
scan1.dat文件内容如下
Sally Level1 12.34 45 1.23e10 inf NaN Yes
Joe Level2 23.54 60 9e19 -inf 0.001No
Bill Level3 34.90 12 2e5 10 100 No
程序如下
fid=fopen('scan1.dat');
C=textscan(fid,'%s%s�2�%u%f%f%s');
fclose(fid);
返回值C是一个1×8的元胞数组,其值如下
C{1}={'Sally';'Joe';'Bill'} classcell
C{2}={'Level1';'Level2';'Level3'} classcell
C{3}=[12.34;23.54;34.9] classsingle
C{4}=[45;60;12] classint8
C{5}=[4294967295;4294967295;200000] classuint32
C{6}=[Inf;-Inf;10] classdouble
C{7}=[NaN;0.001;100] classdouble
C{8}={'Yes';'No';'No'} classcell
注意:
C{5}的前两项超出了uint32数值范围,所以只给uint32的数值上限
例2.3 去除一列字符串
%去除scan1.dat中地2列的字符串
fid=fopen('scan1.dat');
C=textscan(fid,'%sLevel%u8�2�%u%f%f%s');
fclose(fid);
返回一个1×8的元胞数组,其中
C{2}=[1;2;3] classuint8
例2.4 只读第一列
fid=fopen('scan1.dat');
names=textscan(fid,'%s%*[^\n]');
fclose(fid);
返回一个1×1的元胞数组
names{1}={'Sally';'Joe';'Bill'}
例子2.5指定的分隔符和空值的换算
data.csv文件内容如下
1, 2, 3, 4, , 6
7, 8, 9, ,11,12
程序如下
fid=fopen('data.csv');
C=textscan(fid,'%f%f%f%f%u32%f','delimiter',',',...
'EmptyValue',-Inf);
fclose(fid);
返回一个1×6的元胞数组
C{1}=[1;7] classdouble
C{2}=[2;8] classdouble
C{3}=[3;9] classdouble
C{4}=[4;-Inf] classdouble (emptyconvertedto-Inf)
C{5}=[0;11] classuint32 (emptyconvertedto0)
C{6}=[6;12] classdouble
例2.6 CSV文件中含有空值和注释
data2.csv内容如下
abc,2,NA,3,4
//CommentHere
def,na,5,6,7
分离出注释语句
fid=fopen('data2.csv');
C=textscan(fid,'%s%n%n%n%n','delimiter',',',...
'treatAsEmpty',{'NA','na'},...
'commentStyle','//');
fclose(fid);
返回1×5的元胞数组
C{1}={'abc';'def'}
C{2}=[2;NaN]
C{3}=[NaN;5]
C{4}=[3;6]
C{5}=[4;7]
例2.7 处理重复分隔符
data3.csv 内容如下
1,2,3,,4
5,6,7,,8
将multipledelimsasone参数的值赋为1,剔除重复的分隔符
fid=fopen('data3.csv');
C=textscan(fid,'%f%f%f%f','delimiter',',',...
'MultipleDelimsAsOne',1);
fclose(fid);
返回一个1×4的元胞数组
C{1}=[1;5]
C{2}=[2;6]
C{3}=[3;7]
C{4}=[4;8]
例2.8 使用collectoutput开关
grades.txt内容如下
Student_ID |Test1 |Test2 |Test3
1 91.5 89.2 A
2 88.0 67.8 B
3 76.3 78.1 C
4 96.4 81.2 D
collectoutput开关的默认值为0(false)将CSV中的每一列返回到Cell的一列中。
如果将其值设为1(true),则会把相同数据类型的列返回到Cell的一列中。
%默认不开启collectoutput
fid=fopen('grades.txt');
%readcolumnheaders
C_text=textscan(fid,'%s',4,'delimiter','|');
%readnumericdata
C_data0=textscan(fid,'%d%f%f%s')
%开启collectoutput
frewind(fid);
C_text=textscan(fid,'%s',4,'delimiter','|');
C_data1=textscan(fid,'%d%f%f%s',...
'CollectOutput',1)
fclose(fid);
使用collectoutput后,ID成为cell中的一列,Test1和test2合起来成为cell中的一列,test3成为cell中的一列
C_data0=
[4x1int32] [4x1double] [4x1double] {4x1cell}
C_data1=
[4x1int32] [4x2double] {4x1cell}
frewind的作用是让后面的textscan函数使用前面的fid,一个fid只能让一个textscan读
例2.9 使用缺省的控制字符
如果要读的字符串中包含一些控制字符:
\b Backspace
\n Newline
\r Carriagereturn
\t Tab
\\ Backslash(\)
如果你的数据使用不同的控制字符,在调用textscan时能使用sprintf函数显式转换这些控制字符。
lyric=sprintf('Blackbird\fsinging\fin\fthe\fdead\fof\fnight');
C=textscan(lyric,'%s','delimiter',sprintf('\f'));
textscanreturnsa1-by-1cellarrayC:
C{1}=
{'Blackbird';'singing';'in';'the';'dead';'of';'night'}
例2.10 读取部分字符串
lyric='Blackbirdsinginginthedeadofnight'
%读取第一个单词:
[firstword,pos]=textscan(lyric,'�',1);
%读剩下的部分
lastpart=textscan(lyric(pos+1:
end),'%s');
3、当成数据库使用
具体方法可以去XX“matlab 数据库编程”