科学网

 找回密码
  注册

tag 标签: 文本文件

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

C++程序中从文本文件读入一个未知行数和列数的浮点矩阵数据
runningabc 2012-7-12 09:55
#include "iostream" #include iomanip #include fstream #include string #include vector using std::string; using std::vector; typedef vectordouble dVX; typedef vectorvectordouble dMX; /** * 从文本文件中读入一个矩阵数据 */ dMX readfile( string filein ) { dMX m; std::ifstream fin(filein.c_str(),std::ios::in); if (!fin.is_open()) { return m; } std::istringstream istr; string str; dVX tmpvec; double tmp; while(getline(fin,str)) { istr.str(str); while(istrtmp) { tmpvec.push_back(tmp); } m.push_back(tmpvec); tmpvec.clear(); istr.clear(); str.clear(); } fin.close(); return m; } 程序的最终结果是返回一个vector型的二维数组
10219 次阅读|0 个评论
请教网络高手:如何将PDF文件转成文本文件
热度 3 黄安年 2012-6-17 06:08
请教网络高手 : 如何将 PDF 文件转成文本文件 黄安年文 黄安年的博客 / 2012 年 6 月 17 日 发布 对我这个使用电脑时间很长却实际上不懂如何操作的人来说 , 如何将 PDF 文件转成文本文件还是个难题 , 所以特在博文中请教 , 主要是在编辑文集时遇到了这个难题 , 希望有高手给予指点 , 不胜感谢。
个人分类: 三言两语简评(07-11)|3224 次阅读|3 个评论
[转载]C++ 简单读写文本文件统计文件的行数读取文件数据到数组
huozhenhua 2012-6-8 14:33
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。 ifstream -- 从已有的文件读 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in 读 ios::out 写 ios::app 从文件末尾开始写 ios::binary 二进制模式 ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。 ios::noreplace 打开一个文件时,如果文件不存在,创建该文件 ios::trunc 打开一个文件,然后清空内容 ios::ate 打开一个文件时,将位置移动到文件尾 文件指针位置在c++中的用法: ios::beg 文件头 ios::end 文件尾 ios::cur 当前位置 例子: file.seekg(0,ios::beg); //让文件指针定位到文件开头 file.seekg(0,ios::end); //让文件指针定位到文件末尾 file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节 file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节 file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置 常用的错误判断方法: good() 如果文件打开成功 bad() 打开文件时发生错误 eof() 到达文件尾 实例: 一、写入文件 #include iostream #include fstream using namespace std; void main() { ofstream in; in.open("com.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建 int i; char a='a'; for(i=1;i=26;i++)//将26个数字及英文字母写入文件 { if(i10) { in"0"i"\t"a"\n"; a++; } else { ini"\t"a"\n"; a++; } } in.close();//关闭文件 } 打开com.txt,效果如下: 二、读取文件 上面仅仅是将文本写入文件,并没有读取出来。 以下为 读取文件 的一种方法: 将文件每行内容存储到字符串中,再输出字符串 #include iostream #include fstream using namespace std; void main() { char buffer ; fstream out; out.open("com.txt",ios::in); cout"com.txt"" 的内容如下:"endl; while(!out.eof()) { out.getline(buffer,256,'\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束 coutbufferendl; } out.close(); cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了 } 逐个字符的读取文件 : #include iostream #include fstream using namespace std; void main() { fstream in; char c; in.open("comn.txt",ios::in); while(!in.eof()) { inc; coutc; } in.close(); cin.get(); } 这个方法读取的文件,所有字符都一起显示,不会分行。这里字母z显示两次,是正常的,因为在输出文件最后一个字母z之后,又输出了一次(可以仔细考虑程序代码)。 读取文件某一行内容 : #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; string tmp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,tmp)) { n++; } return n; } ReadFile.close(); } string ReadLine(char *filename,int line) { int lines,i=0; string temp; fstream file; file.open(filename,ios::in); lines=CountLines(filename); if(line=0) { return "Error 1: 行数错误,不能为0或负数。"; } if(file.fail()) { return "Error 2: 文件不存在。"; } if(linelines) { return "Error 3: 行数超出文件长度。"; } while(getline(file,temp)iline-1) { i++; } file.close(); return temp; } void main() { int l; char filename ; cout"请输入文件名:"endl; cinfilename; cout"\n请输入要读取的行数:"endl; cinl; coutReadLine(filename,l); cin.get(); cin.get(); } 很显然,根据以上程序,利用循环,可以逐行读取整个文件内容。 三、统计文件的行数 #include iostream #include fstream using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(!ReadFile.eof()) { ReadFile.getline(line,512,'\n'); n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 以上程序的设计思路没有问题,但在实际操作的时候会发现统计出的行数与实际不符,原因在于 ReadFile.getline(line,512,'\n')这一句:当一行字符超过512或遇到回车之后,行数自动加1.如果换行符在新的一行,返回的结果会比实际多1;如果不在新的一行,返回结果与实际相符。可以修改如下: #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 四、读取文件数据到数组 #include iostream #include fstream #include string using namespace std; int CountLines(char *filename)//获取文件的行数 { ifstream ReadFile; int n=0; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在,返回文件行数 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { ifstream file; int LINES; char filename ; cout"请输入要打开的文件名:"endl; cinfilename; file.open(filename,ios::in); if(file.fail()) { cout"文件不存在."endl; file.close(); cin.get(); cin.get(); } else//文件存在 { LINES=CountLines(filename); int *tc=new int ; char *t=new char ; int i=0; while(!file.eof()) //读取数据到数组 { filetc ; filet ; i++; } file.close(); //关闭文件 for(i=0;iLINES;i++)//输出数组内容 couttc "\t"t endl; cin.get(); cin.get(); } }
个人分类: C/C++|6574 次阅读|0 个评论
[转载]MATLAB—【 读取文件各种方法参考】
zhenghui2915 2012-6-5 17:32
matlab 读取文件各种方法 http://www.cnblogs.com/xianghang123/archive/2011/12/06/2277602.html 要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令: help iofun MATLAB中有两种文件I/O程序:high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用 TEXTREAD 函数。 使用high level routines的关键是:文件必须是相似的(homogeneous), 换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。 LOAD/SAVE 主要的high level file I/O routines 是 LOAD 和 SAVE 函数。LOAD 可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE / UIPUTFILE 是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。 UIGETFILE 让你选择一个文件来写(类似Windows ‘另存为’选项?)。用 UIGETFILE ,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意: UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT 是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。 IMPORTDATA 形成 UIIMPORT 的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件 'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','')% 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入: data = D.data text = D.textdata 可以用UIIMPORT读同一个文件并得到同样的结构. 注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。 STRREAD 除是从字符串而不是文件读以外,类似于 TEXTREAD 。 两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft.m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers % This command reads in only the numeric data in the file. The % 'headerlines' property is used to move down to the first row % of interest and the first column of text is ignored with the % '*'operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE 函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。 CSVREAD 用来读分隔符是逗号的文件,是 DLMREAD 的特殊情况。当读空格和Tab分隔的电子数据表文件时, DLMREAD 特别有用。以 'sample_file.txt' 为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前3列后3行,到矩阵D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。 WK1READ/WK1WRITE WK1READ 用来读Lotus123 电子数据表文件的数据; WK1WRITE 用来写矩阵到Lotus123 电子数据表文件。 XLSREAD XLSREAD 用来读Excel的数值和文本数据。 三. 具体例子分析: Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答 :对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。 3.注释(含有独立的数字串)+数据(列数相同): 问题 :这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件 源文件: CODE: Group 212.02.2006 Limei Samples of datas: 50000 CH0CH1CH2CH3 0.0001230.000325 0.000378 0.000598 0.0009860.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式, 这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 --------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57%数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串)+数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件 : CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: --------------------------------------------转-------------------------------------- CODE: function =distilldata(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件: CODE: 0 +47038.7 1.0509:26:07C 2 +46477.7 1.0309:28:38C 4 +44865.7 1.0409:28:48C 6 +41786.4 1.0309:28:56C 8 +39896.0 0.9709:29:03C 10 +37518.4 0.9309:29:15C 12 +35858.5 0.9209:29:30C 14 +46105.0 1.0309:30:21C 16 +46168.6 6.8909:30:30C 18 +48672.3 4.3309:30:40C 20 +49565.7 0.4909:30:48C 22 +49580.7 0.5309:30:55C 24 +49602.3 0.8409:31:03C 26 +49582.5 1.5109:31:11C 28 +49577.0 1.3909:31:19C 30 +49589.3 0.6109:31:27C 32 +49578.3 1.0609:31:29C 34 +49512.5 1.7709:31:38C 解答: 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略) 3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴: 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid); 此时得到的dd, ll 是错误且无意义的! 五. 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第i个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\folder /on /b /s path\list.txt 举例:dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879.准备把这些文件名给放到一个数组里面去。 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE: function =distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章 6. 读取整个txt文件的内容(获得文件中的所有字符): CODE: f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: QUOTE: a1: 123 a2: 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); 相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end
个人分类: 程序设计|1 次阅读|0 个评论
[转载]引用 使用文本文件(.txt)进行数据存取的技巧总结
helloating1990 2012-4-20 14:05
引用 扬尘 的 引用 使用文本文件(.txt)进行数据存取的技巧总结(2) 引用 霖笑 的 使用文本文件(.txt)进行数据存取的技巧总结(2) 三 . 具体例子分析: Matlab 网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: 复制内容到剪贴板 代码 : CODE 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 /CODE 解答 :对于这个 txt 文件,由于各行列数相同,故简单地使用 load,importdata 均可 。 2. 字段名(中、英文字段均可) + 数据: 源文件: 复制内容到剪贴板 代码 : CODE CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 /CODE 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN ),故直接使用 importdata 便可。 3. 注释(含有独立的数字串) + 数据(列数相同): 问题 :这个文件有 4 列 , 但前 6 行是文字说明 ,4 列数字是从第 8 行开始的 . 现在我想把这个文件的前 2 列和文字说明提出来组成一个新的 dat 文件 源文件: 复制内容到剪贴板 代码 : CODE Group 212.02.2006 Limei Samples of datas: 50000 CH0CH1CH2CH3 0.0001230.000325 0.000378 0.000598 0.0009860.000256 0.000245 0.000698 /CODE 目标文件: 复制内容到剪贴板 代码 : CODE Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 /CODE 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用 importdata, load 等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: ------------------------------------- 转 and 改 (by eight)--------------------------------------------------------------------------------------- 复制内容到剪贴板 代码 : CODE clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57% 数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); /CODE --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串) + 数据(列数相同): 源文件: 复制内容到剪贴板 代码 : CODE 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 /CODE 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第 3 种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件: 复制内容到剪贴板 代码 : CODE 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 /CODE 解答: -------------------------------------------- 转 and 改 (by eight)-------------------------------------- 复制内容到剪贴板 代码 : CODE function =distilldata(infile) % 功能说明: % 将保存数据的原始文件中的数值数据读入到一个 data 变量中 % 使用说明: % infile—— 原始数据文件名 ; % data= 数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件( .list ) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n % 判断一行中有没有字符(+- .Ee 和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); /CODE --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6. 各列数据的分离: 源文件: 复制内容到剪贴板 代码 : CODE 0 +47038.7 1.0509:26:07C 2 +46477.7 1.0309:28:38C 4 +44865.7 1.0409:28:48C 6 +41786.4 1.0309:28:56C 8 +39896.0 0.9709:29:03C 10 +37518.4 0.9309:29:15C 12 +35858.5 0.9209:29:30C 14 +46105.0 1.0309:30:21C 16 +46168.6 6.8909:30:30C 18 +48672.3 4.3309:30:40C 20 +49565.7 0.4909:30:48C 22 +49580.7 0.5309:30:55C 24 +49602.3 0.8409:31:03C 26 +49582.5 1.5109:31:11C 28 +49577.0 1.3909:31:19C 30 +49589.3 0.6109:31:27C 32 +49578.3 1.0609:31:29C 34 +49512.5 1.7709:31:38C /CODE 解答 : 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四 . 注意事项 : 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取 mat 文件时可省略) 3. load data.txt 和 A=load(‘data.txt’) 的区别请参阅精华贴: 写 给学习 matlab 的 新 手 们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子: 复制内容到剪贴板 代码 : CODE filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32'); %把 t 中的数据全部读出,即 s 矩阵。 fclose(fid); /CODE 此时得到的 dd, ll 是错误且无意义的! 五 . 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第 i 个文件的文件名就可以表示为 filename(i).name 文件数量为: length(filename) 方法二: 先在 Windows 的 MSDOS (命令行)中使用以下命令生成一个 list.txt 文件: dir path\folder /on /b /s path\list.txt 举例: dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到 list 细胞矩阵中,最后对 filename{i} 便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是 m*n 的,则: 复制内容到剪贴板 代码 : CODE k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle 是对应的文件读取方式的函数 end /CODE 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是 m*n 的,则以上述第二种文件名读取方法为例: 复制内容到剪贴板 代码 : CODE k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end /CODE 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个数组里面去。 解答: 复制内容到剪贴板 代码 : CODE a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end /CODE 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例 1 到例 5 各种情形,不过由于存在自动判断,对某些例子(如例 1 )效率自然要低一点,而对于另外的例子(如例 3 、例 5 )效率估计要高一点(少用了一个循环)。 复制内容到剪贴板 代码 : CODE function =distilldata_eight(infile) % 功能说明: % 将保存数据的原始文件中的数值数据读入到一个 data 变量中(自动判断数据行) % 使用说明: % infile—— 原始数据文件名 ; % data= 数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件( .list ) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; % 正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) /CODE 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高 matlab 运行速度和节省空间的一点心得(之三) )。另外,也可参考《深入浅出 MATLAB 7_X 混合编程》一书第一章 6. 读取整个 txt 文件的内容(获得文件中的所有字符): 复制内容到剪贴板 代码 :CODE f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); /CODE 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: 引用 : a1 : 123 a2 : 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: 复制内容到剪贴板 代码 : CODE a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); /CODE 相反,如果写入的时候复杂一点,则读取的时候会简单一点: 复制内容到剪贴板 代码 : CODE a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end fclose(fid); /CODE
个人分类: matlab|2110 次阅读|0 个评论
[转载]matlab 中如何读取文本文件
helloating1990 2012-4-20 14:02
http://hi.baidu.com/ccst2005/blog/item/d51b1913978fab25dc5401e9.html matlab 中如何读取文本文件 今天需要做个matlab读取txt文件,在网上收集了下,查到了几篇不错的,总结一下,方便大家(包括me)使用: 下面这个函数是取filein中的第line行写入fileout中的程序,如果想实现取特定几行,只要稍微修改一下就可以。 function dataout=dataread(filein,fileout,line) fidin=fopen(filein,'r'); fidout=fopen(fileout,'w'); nline=0; while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 nline=nline+1; if nline==line fprintf(fidout,'%s\n',tline); dataout=tline; end end fclose(fidin); fclose(fidout); %%%%%%%%%%%%%%%%%%%%%%%%%% 调用格式:dataout=dataread(filein,fileout,line) 如果你的txt文件数据是矩阵形式的,而没有其它的文字,用下面的程序就可以读任意行任意列的数据 a=textread('ll.txt'); t=a(1:43,4:10); 1:43是1到43行,4:10是4到10列的数据,当然也可以只读一个数据,如果你的matlab没有textread函数,直接从mathworks网站下载就行。 根据txt文档不同种类介绍不同的读取数据方法 转自: http://hi.baidu.com/youngbrave/blog/item/878db31fcd4f220f304e15bb.html 一、纯数据文件(没有字母和中文,纯数字) 对于这种txt文档,从matalb中读取就简单多了 例如test.txt文件,内容为“17.901 -1.1111 33.045 17.891 -1.1286 33.045 17.884 -1.1345 33.045” 可以在command window中输入load test.txt ,然后就会产生一个test的数据文件,内容跟test.txt中的数据一样;另一种方法是在file/import data....../next/finish 也可产生一个叫test的数据文件。 二、中英文和数据如test1.txt “你好 欢迎来到 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555” 这样的文件怎么读入数据呢? 方法有多种,现举两个比较简单实用的。 方法一: file/import data....../next/finish whos Name Size Bytes Class data 5x4 160 double array textdata 4x1 300 cell array Grand total is 54 elements using 460 bytes data data = 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 textdata textdata = '你好' '欢迎来到' '振动论坛' 'vib.hit.edu.cn' 方法二: =textread('test1.txt','%s%s%s%s','headerlines',4) 说明:%s可以是其他形式,跟读入的数据类型有关,比如这里也可以用%n,%f等。 这里%s的个数和 对应。 =textread('test1.txt','%s%s%s%s','headerlines',4) a1 = '1' '2' '3' '4' '5' a2 = '11' '22' '33' '44' '55' a3 = '111' '222' '333' '444' '555' a4 = '1111' '2222' '3333' '4444' '5555' 因以字符串的形式读入,所以有''。 ———————————————————————————————— 三、中文数据 英文 混乱如test.txt 你好 1 11 111 1111 欢迎来到 2 22 222 2222 振动论坛 3 33 333 3333 vib.hit.edu.cn 4 44 444 4444 5 55 555 5555 说明:这种内容格式的文件用上面的方法是不行的。 以下是由chinamaker编写的一种方法: fidin=fopen('test.txt'); % 打开test2.txt文件 fidout=fopen('mkmatlab.txt','w'); % 创建MKMATLAB.txt文件 while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 if double(tline(1))=48double(tline(1))=57 % 判断首字符是否是数值 fprintf(fidout,'%s\n\n',tline); % 如果是数字行,把此行数据写入文件MKMATLAB.txt continue % 如果是非数字继续下一次循环 end end fclose(fidout); MK=importdata('MKMATLAB.txt'); % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来 MK MK = 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555
个人分类: matlab|2779 次阅读|0 个评论
[转载]巧用DOS批量获取文件名(转)
sunfeifei 2012-4-5 23:23
进入DOS模式 ,进入这个目录 然后dirabc.txt 这样就把该目录下的所有文件保存在abc.txt中了 如果存在子目录就 dirabc.txt /s 如果制定某种类型的文件就 dir *.xls abc.txt (文本文件中包含 abc.txt 这个文件名) ======================================================= 如果你对DOS不熟悉的话,具体步骤如下: 1、在XP中打开这个文件夹,然后在地址栏中复制该文件夹的地址 2、开始-程序-附件-命令提示符 (进入DOS模式) 3、用键盘输入(X:) (输入()里的内容,X表示具体的盘符,如果是相同的盘这一步可以省略),输入结束后要回车一下 4、输入(cd)然后点鼠标右键-粘贴 (cd 后面有一个空格,在DOS模式不好用Ctrl+V这样的快捷键) 5、然后输入上述的DOS命令 Dos 命令中不区分大小写
4358 次阅读|0 个评论
[转载]MATLAB去读文本文件中的数据
linpandr 2012-3-8 21:43
需要从文本文件中读取数据,我的文件很大,格式如下: ********** output: slice 35 ================= 5.9989E+02 current power increment p_mid phi_mid r_size angle energy bunching xrms yrms error x y e-spread far_field 1.0000E+00 4.4409E-14 2.5253E-02 -5.8757E-32 4.2314E-05 3.7847E-05 -2.0000E+00 1.3632E-04 1.1492E-04 7.0876E-05 0.0000E+00 3.6676E-09 -6.2433E-10 1.6261E-01 8.9205E+11 1.0000E+00 -8.8818E-15 2.5736E-02 -1.9881E-02 4.1910E-05 3.7847E-05 -2.0000E+00 1.3438E-04 1.1529E-04 7.0641E-05 0.0000E+00 3.6854E-09 -6.2217E-10 1.6261E-01 8.9205E+11 1.0000E+00 0.0000E+00 2.6211E-02 -4.0115E-02 4.1522E-05 3.7847E-05 -2.0000E+00 1.3259E-04 1.1565E-04 7.0408E-05 0.0000E+00 3.7033E-09 -6.2001E-10 1.6261E-01 8.9205E+11 重复,用下面的代码老是出错,请高手帮忙,代码如下: fidin=fopen('e:\2.txt'); % 打开test2.txt文件 fidout=fopen('mkmatlab.txt','w'); % 创建MKMATLAB.txt文件 while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 if double(tline(1))=47double(tline(1))=58 % 判断首字符是否是数值 fprintf(fidout,'%s\n\n',tline); % 如果是数字行,把此行数据写入文件MKMATLAB.txt continue % 如果是非数字继续下一次循环 end end fclose(fidout); MK=importdata('mkmatlab.txt'); % 将生成的MKMATLAB.txt文件导入工作空间,变量名为MK,实际上它不显示出来 , 问题补充: load什么意思? 我来帮他解答 输入内容已经达到长度限制 还能输入 9999 字 插入图片 删除图片 插入地图 删除地图 插入视频 视频地图 不登录也可以回答 参考资料: 提交回答 取消 2009-8-13 22:43 满意回答 传文件的前十行左右到我的邮箱吧。 wacs5@126.com ===========代码如下======== clear fid=fopen('d:\data.txt','r'); %路径你得调一下 cntline=0; %数据行数 cntseg=0; %段数 indseg= ; %每一段在总体数组中的位置 while (~feof(fid)) line=fgetl(fid); len=length(line); if (len) %非空行 i=1; while(line(i)==' ') %去掉行头无用的信息 i=i+1; end if (line(i)'0' || line(i)'9') %如果不是数字,即字符 if (line(i)=='*') %如果出现*号,说明新的一段开始 cntseg=cntseg+1; indseg(cntseg)=cntline+1; %新段的索引号 end continue; else %如果是数据行的话 if isempty(strfind(line(i:end),'current')) %不含current的数据行 cntline=cntline+1; data(cntline,:)=sscanf(line(i:end),'%f')'; else %含有current currentdata(cntseg,1)=sscanf(line(i:end),'%f'); end end end end fclose(fid);
3695 次阅读|0 个评论
[转载]matlab中的数据导入和导出
linpandr 2012-3-8 21:31
Matlab提供了从磁盘文件或剪贴簿转载数据至工作区(数据导入)和将工作区变量存 入磁盘文件(数据导出)的多种途径。 最简单的办法是使用界面导入向导,打开文件菜单中的导入数据而后按提示操作。Matlab支持的主要数据文件类型和对应函数如下: 导入文本文件 文本文件需要具备统一的行列模式,使用分隔符作为数据项间隔,这些分隔符包括空格、逗号、tab、分号或其它。数据文件可能附带标题行和行列头标签。 数值数据 对于数值数据可以直接使用load函数装载,例如my_data.txt中数据如下: 1 2 3 4 5 6 7 8 9 10 命令A = load('my_data.txt')装载该文本文件数据。 如果数值数据使用其它分隔符,可以使用dlmread读入,假设my_data.txt中数据如下: 7.2;8.5;6.2;6.6 5.4;9.2;8.1;7.2 命令A = dlmread('my_data.txt', ';')读入该数据。 包含行列标签的数值数据 例如: Grade1 Grade2 Grade3 78.8 55.9 45.9 99.5 66.8 78.0 89.5 77.0 56.7 fid = fopen('grades.dat', 'r'); grades = textscan(fid, '%f %f %f', 3, 'headerlines', 1); fclose(fid); 包含字符和数值的混合数据 使用textread函数读入。 导出文本文件 save函数 A = ; save my_data.out A –ASCII dlmwrite函数 dlmwrite('my_data.out',A, ';') MS-Excel电子表格文件 xlsinfo获得文件信息 使用命令 = xlsfinfo(filename)返回文件类型type和工作表信息。如: = xlsfinfo('tempdata.xls') Xlswrite导出数据 d = {'Time', 'Temp'; 12 98; 13 99; 14 97} 命令xlswrite('tempdata.xls', d, 'Temperatures', 'E1')将单元格数组d的数据写出至tempdata.xls文件,新建工作表'Temperatures',从该工作表的E1单元格开始写入。 Xlsread读入数据 ndata = xlsread('tempdata.xls', 'Temperatures') = xlsread('tempdata.xls', 'Temperatures'
2288 次阅读|0 个评论
[转载]matlab中使用文本文件(.txt)进行数据存取的技巧总结
linpandr 2012-3-8 20:59
matlab中使用文本文件(.txt)进行数据存取的技巧总结 from:http://www.chinavib.com/forum/viewthread.php?tid=45622extra=page%3D1%26amp%3Bfilter%3Ddigest 使用文本文件(.txt)进行数据存取的技巧总结 特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。 一. 基本知识: --------------------------------------------------转----------------------------------------------------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种: ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASCII码: 00110101 00110110 00110111 00111000 ↓  ↓      ↓   ↓ 十进制码: 5     6   7      8 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed) \r会被翻译成"回车",即CR(Cariage-Return) 对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示, Windows上是用\n\r(CR-LF)来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。 -------------------------------------------------------------------------------------------------------------------------------------------------- 上述基础其实大可以略过, 简言之,对用户来说: 在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。 二. Matlab的I/O文件操作使用技巧和总结: 1. Matlab 支持的I/O文件(对应“取/存”操作)类型: (所有文件I/O程序不需要特殊的工具箱) http://www.mathworks.com/support/tech-notes/1100/1102.html (注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式) 2. Matlab 的I/O文件指南: http://www.mathworks.com/support/tech-notes/1600/1602.html 以下是部分对应的中文译文: --------------------------------------------------------------转--------------------------------------------------------------------------- 本 技术 支持指南主要处理:ASCII, binary, and MAT files. 要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令: help iofun MATLAB中有两种文件I/O程序:high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用 TEXTREAD 函数。 使用high level routines的关键是:文件必须是相似的(homogeneous), 换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。 LOAD/SAVE 主要的high level file I/O routines 是 LOAD 和 SAVE 函数。LOAD 可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE / UIPUTFILE 是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。 UIGETFILE 让你选择一个文件来写(类似Windows ‘另存为’选项?)。用 UIGETFILE ,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意: UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT 是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。 IMPORTDATA 形成 UIIMPORT 的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件 'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','') % 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入: data = D.data text = D.textdata 可以用UIIMPORT读同一个文件并得到同样的结构. 注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。 STRREAD 除是从字符串而不是文件读以外,类似于 TEXTREAD 。 两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft.m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE 函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。 CSVREAD 用来读分隔符是逗号的文件,是 DLMREAD 的特殊情况。当读空格和Tab分隔的电子数据表文件时, DLMREAD 特别有用。以 'sample_file.txt' 为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前3列后3行,到矩阵D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。 WK1READ/WK1WRITE WK1READ 用来读Lotus123 电子数据表文件的数据; WK1WRITE 用来写矩阵到Lotus123 电子数据表文件。 XLSREAD XLSREAD 用来读Excel的数值和文本数据。 --------------------------------------------------------------------------------------------------------------------------------------------------- 三. 具体例子分析: Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答 :对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。 3.注释(含有独立的数字串)+数据(列数相同): 问题 :这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件 源文件: CODE: Group 2 12.02.2006 Limei Samples CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 and 改(by eight)--------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57 %数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------------------------------------------------------------------------- 4. 注释(不含独立的数字串)+数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件 : CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: --------------------------------------------转 and 改(by eight)------------------------------------------------------------- CODE: function =distilldata(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); ----------------------------------------------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件: CODE: 0 + 47038.7 1.05 09:26:07 C 2 + 46477.7 1.03 09:28:38 C 4 + 44865.7 1.04 09:28:48 C 6 + 41786.4 1.03 09:28:56 C 8 + 39896.0 0.97 09:29:03 C 10 + 37518.4 0.93 09:29:15 C 12 + 35858.5 0.92 09:29:30 C 14 + 46105.0 1.03 09:30:21 C 16 + 46168.6 6.89 09:30:30 C 18 + 48672.3 4.33 09:30:40 C 20 + 49565.7 0.49 09:30:48 C 22 + 49580.7 0.53 09:30:55 C 24 + 49602.3 0.84 09:31:03 C 26 + 49582.5 1.51 09:31:11 C 28 + 49577.0 1.39 09:31:19 C 30 + 49589.3 0.61 09:31:27 C 32 + 49578.3 1.06 09:31:29 C 34 + 49512.5 1.77 09:31:38 C 解答: 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略) 3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴: 写给学习 matlab 的新手们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid); 此时得到的dd, ll 是错误且无意义的! 五. 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第i个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\folder /on /b /s path\list.txt 举例:dir d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个数组里面去。 解答: CODE: a=zeros(879,1); for k=1:879 a(k) = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE: function =distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高matlab运行速度和节省空间的一点心得(之三) )。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章
1940 次阅读|0 个评论
[转载]matlab 中如何读取文本文件
linpandr 2012-3-8 20:56
matlab 中如何读取文本文件 matlab 中如何读取文本文件 clc a=load( '2WD-G6_50kmh 003.txt' , '-ascii' ); % 读取数据 a=textread( '2.txt' , '%f' ) 假定名为 test.txt 的文件中以下为文件内容 " 你好 , 我的数据 欢迎来到 百思论坛 www.baisi.net 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 " 这样的文件怎么读入数据呢? 方法有多种,现举两个比较简单实用的。 方法一: 在文件菜单中选择 file/import data ,按照提示进行操作至结束。 在 command 窗口中输入 whos Name Size Bytes Class data 5x4 160 double array textdata 4x1 300 cell array Grand total is 54 elements using 460 bytes data data = 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 textdata textdata = ' 你好 ' ' 欢迎来到 ' ' 百思论坛 ' 'www.baisi.net' 方法二: =textread('test1.txt','%s%s%s%s','headerlines',4) 说明: %s 可以是其他形式,跟读入的数据类型有关,比如这里也可以用 %n,%f 等。 这里 %s 的个数和 对应。 =textread('test1.txt','%s%s%s%s','headerlines',4) a1 = '1' '2' '3' '4' '5' a2 = '11' '22' '33' '44' '55' a3 = '111' '222' '333' '444' '555' a4 = '1111' '2222' '3333' '4444' '5555' 因以字符串的形式读入,所以有 '' 。 文件内容形式二(假定文件名为 test2.txt ): 你好 1 11 111 1111 欢迎来到 2 22 222 2222 百思论坛 3 33 333 3333 www.baisi.net 4 44 444 4444 5 55 555 5555 说明:这种内容格式的文件用上面的方法是不行的。 以下是由 chinamaker 编写的一种方法: fidin=fopen('test2.txt'); % 打开 test2.txt 文件 fidout=fopen('mkmatlab.txt','w'); % 创建 MKMATLAB.txt 文件 while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读行 if double(tline(1))=48double(tline(1))=57 % 判断首字符是否是数值 fprintf(fidout,'%s\n\n',tline); % 如果是数字行,把此行数据写入文件 MKMATLAB.txt continue % 如果是非数字继续下一次循环 end end fclose(fidout); MK=importdata('MKMATLAB.txt'); % 将生成的 MKMATLAB.txt 文件导入工作空间,变量名为 MK ,实际上它不显示出来 MK MK = 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 1 matlab 中怎么按行读取数据? 各位高手,请指点一下 matlab 中,读取文件的时候怎么样实现按行读取呢? 比如: dat.txt 存贮的数据: 2 5 3 6 2 3 5 1 9 5 4 6 三行数据,怎么样分别用 p1 , p2 , p3 读取对应行的数据? fid=fopen('test.txt'); for i=1: 3 a{i}=fgets(fid);% 行读取指令。 end fclose(fid); 就 ok 了。 by Realasking matlab 可以读 txt 文件。使用 fopen , fread , fclose 函数。关键是数据的格式,从而写相应的 fread 语句。 比如你的数据矩阵是 F= ; 那么讲该数据写入一个 data 文件是 filename='test.dat'; fid = fopen(filename,'w'); count = fwrite(fid,F','uchar'); fclose(fid); 将上述数据读出并存入 2*2 得矩阵是 filename='test.dat'; nSize=4; 因为上述矩阵共有 4 个数据 nRow=2; nColumn=2; fid = fopen(filename,'rb'); temp = fread(fid, nSize, 'uchar'); fclose(fid); result = reshape(temp, )'; 求助 ]matlab 文件输入 txt 文件问题 悬赏分: 150 - 解决时间: 2007-5-30 07:23 data.txt: 11 12 159;22 56 123;258 56 963;…… data.txt 里面存有诸如上面的数据 300 万组。我需要每次按顺序读取 2000 组到数组 A 里,进行处理。 即 A= 11 12 159 22 56 123 …… 直到读完最后一个数据。 这个程序要用 matlab 实现,怎么编啊。请各位大虾帮帮忙啊!谢谢了! 即使 data.txt 的数据格式是这样的也可以,需要转换。 1 2 3;4 5 6;7 8 9;10 11 12 ;13 14 15 ;16 17 18 ;19 20 21 ;22 23 24 ;25 26 27 ;28 29 30 ;31 32 33 ;34 35 36 ; % 程序为: clc;clear; load data.txt data AA= ' m=4 % 相当于你的 2000 N=length(data)/m % 相当于 3000000/2000 for k=0:N/3-1 A(:,:,k+1)=AA((m*k+1):(m*k+m),:);% 变为三维矩阵了。 end A 运行结果: data = Columns 1 through 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Columns 22 through 36 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 AA = 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 m = 4 N = 9 A(:,:,1) = 1 2 3 4 5 6 7 8 9 10 11 12 A(:,:,2) = 13 14 15 16 17 18 19 20 21 22 23 24 A(:,:,3) = 25 26 27 28 29 30 31 32 33 34 35 36
15540 次阅读|0 个评论
[转载]python读写数组类型的文本文件怎么做
ywmucn 2011-12-18 13:35
转自: http://www.linuxsir.org/bbs/showthread.php?t=198536 scidepro python没有数据类型定义的,可是面对数组类型的数据需要从文本输入或输出到文本要怎么做啊?初学python,哪位大侠给出个代码帮帮小弟啊。谢谢! 学生成绩文本例子:abc.txt 张三 60 70 80 90 李四 10 20 30 40 王五 80 50 70 100 #注明:文本格式是:姓名+四个空格键+语文成绩+四个空格键+数学成绩+四个空格键+英语成绩+四个空格键+物理成绩,一个学生一行 要定义个类来描述吗?用c语言的结构可以描述,python怎么做?需要让这些姓名和单科成绩都可以分别引用的。大侠方便的话给个代码,有些晕。 谢谢。 对python的文件操作不大懂,就知道个readline函数 chunchengfh 在Python中用list实现一个二维数组,以便用来引用姓名和单科成绩。如以下代码所示: #!/usr/local/bin/python import sys file=open(sys.argv ,'r') row= line=str.split() for field in line: column.append(field) row.append(column) print '输出:' for people in row: print '%s 的数学成绩为: %s' %(people ,people ) 用row 来引用单个元素。由于没有设置数组的边界,所以上述代码也可读别的格式的类似文件,如用tab和任意个空格分隔数据,也可再增加几列,如 张三 60 70 80 90 76 88 95 李四 10 20 30 40 63 72 93 王五 80 50 70 100 83 77 100 ......
个人分类: 脚本|5401 次阅读|0 个评论
解决linux下从文本文件乱码问题
elitelcf 2011-5-17 11:24
由于一些历史原因,linux下的中文编码大多使用UTF-8变字节编码作为中文显示的默认编码。 而windows则不然,中文字符界面非常混乱,既有使用UTF-8编码,也使用GBK,GBK2312,GBK18030等。 而网络上大部分的文本文件都是在windows下创建的,所以给linux下显示中文造成了很大的麻烦。 好在微软给出了一种混合的字节编码解决方案MBCS http://msdn.microsoft.com/zh-cn/library/5z097dxa(v=vs.80).aspx 在linux命令行下; gconf-editor-apps-gedit2-preferences-encodings 在auto_detected一栏中双击,添加MBCS然后将其移动至第一位,ok,现在用gedit打开文件,完美显示中文。
个人分类: Linux|5943 次阅读|0 个评论
[转载]C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组(转)
songyanru243 2011-4-21 10:20
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。 ifstream -- 从已有的文件读 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in 读 ios::out 写 ios::app 从文件末尾开始写 ios::binary 二进制模式 ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。 ios::noreplace 打开一个文件时,如果文件不存在,创建该文件 ios::trunc 打开一个文件,然后清空内容 ios::ate 打开一个文件时,将位置移动到文件尾 文件指针位置在c++中的用法: ios::beg 文件头 ios::end 文件尾 ios::cur 当前位置 例子: file.seekg(0,ios::beg); //让文件指针定位到文件开头 file.seekg(0,ios::end); //让文件指针定位到文件末尾 file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节 file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节 file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置 常用的错误判断方法: good() 如果文件打开成功 bad() 打开文件时发生错误 eof() 到达文件尾 实例: 一、写入文件 #include iostream #include fstream using namespace std; void main() { ofstream in; in.open("com.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建 int i; char a='a'; for(i=1;i=26;i++)//将26个数字及英文字母写入文件 { if(i10) { in"0"i"\t"a"\n"; a++; } else { ini"\t"a"\n"; a++; } } in.close();//关闭文件 } 打开com.txt,效果如下: 二、读取文件 上面仅仅是将文本写入文件,并没有读取出来。 以下为读取文件的一种方法:将文件每行内容存储到字符串中,再输出字符串 #include iostream #include fstream using namespace std; void main() { char buffer ; fstream out; out.open("com.txt",ios::in); cout"com.txt"" 的内容如下:"endl; while(!out.eof()) { out.getline(buffer,256,'\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束 coutbufferendl; } out.close(); cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了 } 逐个字符的读取文件: #include iostream #include fstream using namespace std; void main() { fstream in; char c; in.open("comn.txt",ios::in); while(!in.eof()) { inc; coutc; } in.close(); cin.get(); } 这个方法读取的文件,所有字符都一起显示,不会分行。这里字母z显示两次,是正常的,因为在输出文件最后一个字母z之后,又输出了一次(可以仔细考虑程序代码)。 读取文件某一行内容: #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; string tmp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,tmp)) { n++; } return n; } ReadFile.close(); } string ReadLine(char *filename,int line) { int lines,i=0; string temp; fstream file; file.open(filename,ios::in); lines=CountLines(filename); if(line=0) { return "Error 1: 行数错误,不能为0或负数。"; } if(file.fail()) { return "Error 2: 文件不存在。"; } if(linelines) { return "Error 3: 行数超出文件长度。"; } while(getline(file,temp)iline-1) { i++; } file.close(); return temp; } void main() { int l; char filename ; cout"请输入文件名:"endl; cinfilename; cout"\n请输入要读取的行数:"endl; cinl; coutReadLine(filename,l); cin.get(); cin.get(); } 很显然,根据以上程序,利用循环,可以逐行读取整个文件内容。 三、统计文件的行数 #include iostream #include fstream using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(!ReadFile.eof()) { ReadFile.getline(line,512,'\n'); n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 以上程序的设计思路没有问题,但在实际操作的时候会发现统计出的行数与实际不符,原因在于ReadFile.getline(line,512,'\n')这一句:当一行字符超过512或遇到回车之后,行数自动加1.如果换行符在新的一行,返回的结果会比实际多1;如果不在新的一行,返回结果与实际相符。可以修改如下: #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 四、读取文件数据到数组 #include iostream #include fstream #include string using namespace std; int CountLines(char *filename)//获取文件的行数 { ifstream ReadFile; int n=0; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在,返回文件行数 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { ifstream file; int LINES; char filename ; cout"请输入要打开的文件名:"endl; cinfilename; file.open(filename,ios::in); if(file.fail()) { cout"文件不存在."endl; file.close(); cin.get(); cin.get(); } else//文件存在 { LINES=CountLines(filename); int *tc=new int ; char *t=new char ; int i=0; while(!file.eof()) //读取数据到数组 { filetc ; filet ; i++; } file.close(); //关闭文件 for(i=0;iLINES;i++)//输出数组内容 couttc "\t"t endl; cin.get(); cin.get(); } }
个人分类: 科研交流|3560 次阅读|0 个评论
电子书阅读器
liumwei 2011-4-20 22:42
目前,Linux系统已经深入到各行各业种,很多人都在接触Linux系统。特别是搞科学计算的那群人,更是如此。远的不少说,就目前很流行的 Android系统就是Linux系统的一种。只不过,它适合运行于手持设备等终端上。此外,如果你是palm手机的忠实用户,其卖给HP的webos也 是Linux系统。在这些手持设备上,常常能看到电子书的身影。其实这些手持电子书多数都是个头很小txt的文本文件。但是经过电子阅读器的处理,变得特 别适合阅读。 palm pre上的电子阅读器pReader 你可能会想,在Linux-PC中有没有这种阅读器呢。当然,那些Linux系统的使用高手,可能觉得不屑一顾,而且,还会觉得这样想是不是脑子哪里不正 常:Linux下随便找个软件(firefox、gedit、mousePad)就可打开这种文件,甚至是采用linux下的终端命令(vim、 nano),也能很好地完成这种任务。但是,它们似乎对一般阅读者而言,还是显得有点单薄和不方便。毕竟,尺有所长,就有所短。而且,如果是这样,手机生 产商为什么不劝说用户直接命令打开txt的电子书呢?看看下面的Linux中常见的文本编辑器以及终端命令打开txt文件的结果的图片,可能就有感受了: Vim命令打开txt电子书 nano命令打开电子书 文本编辑器mousePad打开txt电子书 那么在Linux下有没有这样的电子书阅读器呢?答案是肯定的。这里推荐一个可运行很好运行于BioInfoServ 4.0/Ubuntu 10.04的电子书阅读器BFReader。先看其使用界面和文件打开状况,和前面的比较一下,看看那个看起来舒服点,更适合用户操作点。 很显然, BFReader 显示的效果最好,而且有利于阅读中的操作。这 个软件目前能支持fb2、html、chm、plucker、 palmdoc、ztxt、tcr (psion text)、rtf、oeb、openreader、non-DRM'ed、mobipocket和plain text等格式的电子书,而且它还能直接从tar、zip、gzip、bzip2等电子书压缩包中直接将电子书读出显示。此外,它支持电子书的管理和搜索 下载。是一个十分不错的多平台电子书阅读器。 目前这个软件,已经收录到 BioInfoServ 4.0的软件仓库 中,能很好地支持中文电子书的显示和阅读。如果你发现中文乱码的话,需打开该软件的“设置“界面,在“语言“和“样式“选单中,选取相应的字符编码以及字体即可。如下: 当然,还有其他的电子书阅读器,还有 Calibre 、 QReader 、Amazon Kindle2、 Evince 、 Lucidor 和 Sigil 等。
个人分类: Linux软件|5366 次阅读|0 个评论
[转载]使用C++的fstream读取有结构的字符串和数值混排的文本文件
热度 2 songyanru243 2011-4-14 15:55
因为要经常接触字符串和数值混排的数据文本文件,所以,如何有效的读取这类文件成了我头痛的事,不过今日学习了日志 ,找到的解决方法,编程读写实例如下。 要读取的目标文件dat.txt内容如下: zzz 8 10.0 2.5 2.55 llz 10 20.2 3.9 4.96 读写方法编程如下: #include fstream #include iostream using namespace std; void main() { ifstream fin; char name ; int inum; float fnum ; fin.open("dat.txt");// 打开要读的文件 if (fin.good())// 判断是否成功打开 { while (!fin.eof()) { fin name;// 读取字符串 fin inum;// 读取整数数值 for(int i = 0; i 3; i++) { fin fnum ;// 循环读取浮点数 } cout name ' ' inum ' ' fnum endl;//显示检验结果的正确性 } } else { cout "File can't open" endl; } fin.close();// 关闭文件 } 运行结果如下: zzz 8 2.55 llz 10 4.96 Press any key to continue
个人分类: 科研交流|6236 次阅读|2 个评论
[转载].C++ 简单读写文本文件、统计文件的行数、读取文件数据到数组
热度 1 songyanru243 2011-4-14 15:45
fstream提供了三个类,用来实现c++对文件的操作。(文件的创建、读、写)。 ifstream -- 从已有的文件读 ofstream -- 向文件写内容 fstream - 打开文件供读写 文件打开模式: ios::in 读 ios::out 写 ios::app 从文件末尾开始写 ios::binary 二进制模式 ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。 ios::noreplace 打开一个文件时,如果文件不存在,创建该文件 ios::trunc 打开一个文件,然后清空内容 ios::ate 打开一个文件时,将位置移动到文件尾 文件指针位置在c++中的用法: ios::beg 文件头 ios::end 文件尾 ios::cur 当前位置 例子: file.seekg(0,ios::beg); //让文件指针定位到文件开头 file.seekg(0,ios::end); //让文件指针定位到文件末尾 file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节 file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节 file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置 常用的错误判断方法: good() 如果文件打开成功 bad() 打开文件时发生错误 eof() 到达文件尾 实例: 一、写入文件 #include iostream #include fstream using namespace std; void main() { ofstream in; in.open("com.txt",ios::trunc); //ios::trunc表示在打开文件前将文件清空,由于是写入,文件不存在则创建 int i; char a='a'; for(i=1;i=26;i++)//将26个数字及英文字母写入文件 { if(i10) { in"0"i"\t"a"\n"; a++; } else { ini"\t"a"\n"; a++; } } in.close();//关闭文件 } 打开com.txt,效果如下: 二、读取文件 上面仅仅是将文本写入文件,并没有读取出来。 以下为 读取文件 的一种方法: 将文件每行内容存储到字符串中,再输出字符串 #include iostream #include fstream using namespace std; void main() { char buffer ; fstream out; out.open("com.txt",ios::in); cout"com.txt"" 的内容如下:"endl; while(!out.eof()) { out.getline(buffer,256,'\n');//getline(char *,int,char) 表示该行字符达到256个或遇到换行就结束 coutbufferendl; } out.close(); cin.get();//cin.get() 是用来读取回车键的,如果没这一行,输出的结果一闪就消失了 } 逐个字符的读取文件 : #include iostream #include fstream using namespace std; void main() { fstream in; char c; in.open("comn.txt",ios::in); while(!in.eof()) { inc; coutc; } in.close(); cin.get(); } 这个方法读取的文件,所有字符都一起显示,不会分行。这里字母z显示两次,是正常的,因为在输出文件最后一个字母z之后,又输出了一次(可以仔细考虑程序代码)。 读取文件某一行内容 : #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; string tmp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,tmp)) { n++; } return n; } ReadFile.close(); } string ReadLine(char *filename,int line) { int lines,i=0; string temp; fstream file; file.open(filename,ios::in); lines=CountLines(filename); if(line=0) { return "Error 1: 行数错误,不能为0或负数。"; } if(file.fail()) { return "Error 2: 文件不存在。"; } if(linelines) { return "Error 3: 行数超出文件长度。"; } while(getline(file,temp)iline-1) { i++; } file.close(); return temp; } void main() { int l; char filename ; cout"请输入文件名:"endl; cinfilename; cout"\n请输入要读取的行数:"endl; cinl; coutReadLine(filename,l); cin.get(); cin.get(); } 很显然,根据以上程序,利用循环,可以逐行读取整个文件内容。 三、统计文件的行数 #include iostream #include fstream using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(!ReadFile.eof()) { ReadFile.getline(line,512,'\n'); n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 以上程序的设计思路没有问题,但在实际操作的时候会发现统计出的行数与实际不符,原因在于ReadFile.getline(line,512,'\n')这一句:当一行字符超过512或遇到回车之后,行数自动加1.如果换行符在新的一行,返回的结果会比实际多1;如果不在新的一行,返回结果与实际相符。可以修改如下: #include iostream #include fstream #include string using namespace std; int CountLines(char *filename) { ifstream ReadFile; int n=0; char line ; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { cout"comn.txt的行数为: "CountLines("comn.txt")endl; cin.get(); } 四、读取文件数据到数组 #include iostream #include fstream #include string using namespace std; int CountLines(char *filename)//获取文件的行数 { ifstream ReadFile; int n=0; string temp; ReadFile.open(filename,ios::in);//ios::in 表示以只读的方式读取文件 if(ReadFile.fail())//文件打开失败:返回0 { return 0; } else//文件存在,返回文件行数 { while(getline(ReadFile,temp)) { n++; } return n; } ReadFile.close(); } void main() { ifstream file; int LINES; char filename ; cout"请输入要打开的文件名:"endl; cinfilename; file.open(filename,ios::in); if(file.fail()) { cout"文件不存在."endl; file.close(); cin.get(); cin.get(); } else//文件存在 { LINES=CountLines(filename); int *tc=new int ; char *t=new char ; int i=0; while(!file.eof()) //读取数据到数组 { filetc ; filet ; i++; } file.close(); //关闭文件 for(i=0;iLINES;i++)//输出数组内容 couttc "\t"t endl; cin.get(); cin.get(); } }
个人分类: 科研交流|9080 次阅读|1 个评论
[转载](转)使用文本文件(.txt)进行数据存取的技巧总结
songyanru243 2011-3-17 09:04
特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之 结果 ,欢迎大家指正、补充。 一. 基本知识: --------------------------------------------------转---------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种: ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASCII码: 00110101 00110110 00110111 00111000 ↓  ↓      ↓   ↓ 十进制码: 5     6   7     8 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源 程序 文件就是ASCII文件,用DOS 命令 TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C 系统 在处理这些文件时,并不区 分类 型,都看成是字符流,按字节进行处理。 输入 输出 字符流的开始和结束只由程序控制而不受物理 符号 (如回车符)的控制。因此也把这种文件称作“流式文件”。 2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以"文本"方式打开一个文件,那么在读字符的时候,系统会把所有的"\r\n"序列转成"\n",在写入时把"\n"转成"\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n一般会操作系统被翻译成"行的结束",即LF(Line-Feed) \r会被翻译成"回车",即CR(Cariage-Return) 对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示, Windows上是用\n\r(CR-LF)来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如 图形 或字处理文档),或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS 格式 的文件,必须用二进制方式打开和读写。 --------------------------------------------------------------------------------------------------------- 上述 基础 其实大可以略过, 简言之,对用户来说: 在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。 二. Matlab的I/O文件操作使用技巧和总结: 1. Matlab 支持的I/O文件(对应“取/存”操作)类型: (所有文件I/O程序不需要特殊的 工具箱 ) http://www.mathworks.com/support/tech-notes/1100/1102.html (注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式) 2. Matlab 的I/O文件指南: http://www.mathworks.com/support/tech-notes/1600/1602.html 以下是部分对应的中文译文: --------------------------------------------------------------转---------------------------------------- 本技术支持指南主要处理:ASCII, binary, and MAT files. 要得到 MATLAB 中可用来读写各种文件格式的完全 函数 列表,可以键入以下命令: help iofun MATLAB中有两种文件I/O程序:high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的 编程 。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以 调用 一些low level routines自己写一个函数,或者是简单的用 TEXTREAD 函数。 使用high level routines的关键是:文件必须是相似的(homogeneous), 换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。 LOAD/SAVE 主要的high level file I/O routines 是 LOAD 和 SAVE 函数。LOAD 可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB 变量 写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE / UIPUTFILE 是基于图形用户 界面 ( GUI )的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。 UIGETFILE 让你选择一个文件来写(类似Windows ‘另存为’选项?)。用 UIGETFILE ,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意: UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT 是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。 IMPORTDATA 形成 UIIMPORT 的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件 'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','')% 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入: data = D.data text = D.textdata 可以用UIIMPORT读同一个文件并得到同样的结构. 注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态high level routine, 设计 用来读ASCII格式的文本和/或数值数据文件。 STRREAD 除是从字符串而不是文件读以外,类似于 TEXTREAD 。 两个函数可以用许多 参数 来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的 应用 (如同low level routines做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft .m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers % This command reads in only the numeric data in the file. The % 'headerlines' property is used to move down to the first row % of interest and the first column of text is ignored with the % '*'operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE 函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行 代码 实现的功能可以用DLMREAD/DLMWRITE简化成一行。 CSVREAD 用来读分隔符是逗号的文件,是 DLMREAD 的特殊情况。当读空格和Tab分隔的电子数据表文件时, DLMREAD 特别有用。以 'sample_file.txt' 为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前3列后3行,到 矩阵 D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。 WK1READ/WK1WRITE WK1READ 用来读Lotus123 电子数据表文件的数据; WK1WRITE 用来写矩阵到Lotus123 电子数据表文件。 XLSREAD XLSREAD 用来读 Excel 的数值和文本数据。 --------------------------------------------------------------------------------------------------------- 三. 具体例子分析: Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答 :对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。 3.注释(含有独立的 数字 串)+数据(列数相同): 问题 :这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件 源文件: CODE: Group 212.02.2006 Limei Samples of datas: 50000 CH0CH1CH2CH3 0.0001230.000325 0.000378 0.000598 0.0009860.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 --------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57%数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串)+数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件 : CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: --------------------------------------------转-------------------------------------- CODE: function =distilldata(infile) %功能说明: %将 保存 数据的原始文件中的数值数据读入到一个data变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件: CODE: 0 +47038.7 1.0509:26:07C 2 +46477.7 1.0309:28:38C 4 +44865.7 1.0409:28:48C 6 +41786.4 1.0309:28:56C 8 +39896.0 0.9709:29:03C 10 +37518.4 0.9309:29:15C 12 +35858.5 0.9209:29:30C 14 +46105.0 1.0309:30:21C 16 +46168.6 6.8909:30:30C 18 +48672.3 4.3309:30:40C 20 +49565.7 0.4909:30:48C 22 +49580.7 0.5309:30:55C 24 +49602.3 0.8409:31:03C 26 +49582.5 1.5109:31:11C 28 +49577.0 1.3909:31:19C 30 +49589.3 0.6109:31:27C 32 +49578.3 1.0609:31:29C 34 +49512.5 1.7709:31:38C 解答: 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略) 3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴: 写给学习 matlab 的 新手 们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个 错误 的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid); 此时得到的dd, ll 是错误且无意义的! 五. 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第i个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\folder /on /b /s path\list.txt 举例:dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879.准备把这些文件名给放到一个 数组 里面去。 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE: function =distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高matlab 运行 速度和节省空间的一点心得(之三) )。另外,也可参考《深入浅出MATLAB 7_X 混合编程 》一书第一章 6. 读取整个txt文件的内容(获得文件中的所有字符): CODE: f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: QUOTE: a1: 123 a2: 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); 相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end fclose(fid);
个人分类: 科研交流|950 次阅读|0 个评论
[原创]PHP+TXT的随机引文实现
xiangxing 2010-4-14 16:06
研究PHP有一段时间,对基础知识有了一些了解之后,逐渐开始在做一些代码集成的工作以实现自己的想法,其中一个想法是采用PHP从TXT中随机读取一行文字,刷新一次就改变成别的行的文字。具体的应用如在个人的站点中实现名人名言的随机调用而不必依赖数据库。 代码如下: ?PHP /* -------------------------------------------------------------------------------- * @文件/类名File/Class Name: PHP+TXT随机引文实现; * @日期时间DateTime: 2010-04-14 15:52:07; * @作者名字Author: Siqin.Hou; * @联系方式E_mail: siqin.hou@gmail.com ; * @版权归属信息Copyright: Siqin.Hou; -------------------------------------------------------------------------------- */ function RandomWisdomLine($txtFile,$Num) { //我取名为随机智慧函数,功能:从一个文本文件中随机读取一定行数的文本。参数$txtFile,是您要打开的文本文件,参数$Num要随机显示的行数; $file = fopen($txtFile,r) or die(打开文件失败);//打开文件 $mydata=file($txtFile);//把整个文件读入到一个数组中,一行一个元素 /*@检验文件是否成功读取到数组 echo pre; print_r($mydata); echo /pre; */ $DataNum=count($mydata); //计算数组一共有多少行,即文件有多少行 /*检验是否有输出行数 echo 共有记录:.$DataNum.条br /; */ //获取随机行 for($i=0;$i$Num;$i++) { $num=mt_rand(0,$DataNum-1); //$num=rand(0,$DataNum-1); $final =$mydata ; //shuffle($mydata); //echo $final .br /; } return $final; //返回数组 //unset($mydata);释放$mydata数组 } //使用实例,在与这个PHP文件同一路径下新建两个文本文件,分别为English.txt,Chinese.txt $EnglishData=RandomWisdomLine('English.txt','5');//5行英文 $ChineseData=RandomWisdomLine('Chinese.txt','5');//5行中文 ? !--嵌入HTML代码-- dl dtEnglish/dt ?PHP for($i=0;$icount($EnglishData);$i++) { echo dd.$EnglishData ./dd; } ? dtChinese/dt ?PHP for($i=0;$icount($ChineseData);$i++) { echo dd.$ChineseData ./dd; } ? /dl
个人分类: PHP学习实践|6738 次阅读|0 个评论
FTP文本文件传输后字符改变问题如何解决?
jlpemail 2008-9-16 09:11
FTP 文本文件传输后字符改变问题如何解决? 我站的 GPS 跟踪站采用 FTP向美国 NASA的 数据中心传输数据。 今年第253日出现了问题:(bjfs为我站的英文名字) bjfs: antenna ASH+0093*B_M SNOW in RINEX day 253 does not match antenna ASH700936B_M SNOW in site log bjfs: 正确 ASH700936B_M SNOW 错误 ASH+0093*B_M SNOW 初步判定天线型号数据在传输中发生了变化。不知道其原因?如何解决这个问题? 向网络数据传输高手请教,非常感谢!
个人分类: 消息场|4236 次阅读|3 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-19 06:17

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部