科学网

 找回密码
  注册

tag 标签: 数据读取

相关帖子

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

没有相关内容

相关日志

USE R: netCDF格式的通量数据的读取
zhuangwei 2018-8-7 16:11
通量(涡度相关)数据,是分析生态系统水碳过程的常用数据。在Fluxnet可以免费申请到全球公开的通量数据。这些通量数据的格式多数是NetCDF。NetCDF可以储存观测站点和各观测项的元数据,在时间序列数据的存储和传播中使用广泛。这里介绍一下R里面的一个命令,可以方便读取Fluxnet的NetCDF格式的通量数据。 这里用到的读取命令readFLUXNETNcdf来自Jannis v. Buttlar 开发的 ncdf.tools 包。这里用的数据 DalyUncleared_2017_L3 nc,是澳洲通量网的 DalyRiverUncleared 站点 2017 年的 Level 3 数据。感谢 Jason Beringer 公开了这一数据。无需注册即可下载,网址: http://data.ozflux.org.au/portal/pub/viewColDetails.jspx?collection.id=1882715collection.owner.id=304viewType=anonymous 数据中的各个变量的意义和单位在网址提供的Metadata中可以查到。 以下为读取通量数据的代码,供参考。 # install.packages(RNetCDF) # install.packages(cli,pillar) # install.packages('ncdf.tools', 'ggplot2') # if not installed, install please library(ncdf.tools) library(ggplot2) setwd( your working directory ) # rewriten as your working directory # read nc data DaU2017 - readFLUXNETNcdf(##title read data from FLUXNET NetCDF file. path = getwd() ## character string: path to the input file(s) , sites = 'DalyUncleared_2017_L3' ## character string: ids of the sites to extract , pars = 'all' ## character string: names of the variables to extract , time.ends = c(as.POSIXlt('2017-01-01 00:00:00'), as.POSIXlt('2017-12-31 23:30:00')) ## POSIXct object: start and end date of the period to extract. , dim.borders = list(1)## list: indices for other dimensions ) dim(DaU2017) # 1 251 17520 1 rownames(DaU2017 ) # check the names of the variables # it will show names of 251 variables. # For the meanings and units of the variables, check the meta file in ozflux website. tmp = data.frame(matrix(nrow = 17520, ncol = 251)) for (i in 1:251) {tmp = as.numeric(DaU2017 ) } names(tmp) - rownames(DaU2017 ) DaU_2017 - tmp DaU_2017$DT - seq(as.POSIXct(2017-01-01 00:00:00, format = %Y-%m-%d %H:%M:%S), length.out=17520, by ='30 mins') DaU_2017$DT - as.Date(DaU_2017$DT) # OK! Timeseries of flux data have been input. rownames(DaU2017 ) # view the names of variables # AGC_7500 AGC_7500_QCFlag Ah Ah_7500_Av # Ah_7500_Av_QCFlag Ah_7500_Sd Ah_7500_Sd_QCFlag Ah_HMP_21m # Ah_HMP_21m_QCFlag Ah_HMP_2m Ah_HMP_2m_QCFlag Ah_QCFlag # AhAh AhAh_QCFlag Cc Cc_7500_Av # Cc_7500_Av_QCFlag Cc_7500_Sd Cc_7500_Sd_QCFlag Cc_QCFlag # CcCc CcCc_QCFlag co2_wpl_Fe co2_wpl_Fe_QCFlag # co2_wpl_Fh co2_wpl_Fh_QCFlag Cpd Cpd_QCFlag # Cpm Cpm_QCFlag Cpw Cpw_QCFlag # crs Cs Cs_QCFlag Day # Day_QCFlag Ddd Ddd_QCFlag Diag_7500 # Diag_7500_QCFlag Diag_CSAT Diag_CSAT_QCFlag Diag_IRGA # Diag_IRGA_QCFlag Diag_SONIC Diag_SONIC_QCFlag dTs # dTs_QCFlag e e_QCFlag esat # esat_QCFlag eta eta_QCFlag Fa # Fa_QCFlag Fc Fc_PFP Fc_PFP_QCFlag # Fc_QCFlag Fc_single Fc_single_QCFlag Fe # Fe_PFP Fe_PFP_QCFlag Fe_QCFlag Fe_raw # Fe_raw_QCFlag Fg Fg_8cma Fg_8cma_QCFlag # Fg_8cmb Fg_8cmb_QCFlag Fg_Av Fg_Av_QCFlag # Fg_QCFlag Fh Fh_PFP Fh_PFP_QCFlag # Fh_QCFlag Fhv Fhv_QCFlag Fld # Fld_QCFlag Flu Flu_QCFlag Fm # Fm_PFP Fm_PFP_QCFlag Fm_QCFlag Fn # Fn_KZ Fn_KZ_QCFlag Fn_NR Fn_NR_QCFlag # Fn_QCFlag Fsd Fsd_QCFlag Fsd_syn # Fsd_syn_QCFlag Fsu Fsu_QCFlag H2O # H2O_QCFlag Hdh Hdh_QCFlag Hour # Hour_QCFlag L L_QCFlag Lv # Lv_QCFlag Minute Minute_QCFlag Month # Month_QCFlag Precip Precip_QCFlag ps # ps_QCFlag q q_QCFlag RH # RH_QCFlag RhoCp RhoCp_QCFlag rhod # rhod_QCFlag rhom rhom_QCFlag rhow # rhow_QCFlag S S_QCFlag Second # Second_QCFlag SHD SHD_QCFlag solar_altitude # solar_altitude_QCFlag Sws Sws_50cm Sws_50cm_QCFlag # Sws_5cm Sws_5cm_QCFlag Sws_QCFlag Ta # Ta_CSAT Ta_CSAT_QCFlag Ta_HMP_21m Ta_HMP_21m_QCFlag # Ta_HMP_2m Ta_HMP_2m_QCFlag Ta_QCFlag theta # theta_QCFlag Tpanel Tpanel_QCFlag Ts # Ts_8cma Ts_8cma_QCFlag Ts_QCFlag Tv_CSAT # Tv_CSAT_QCFlag u u_QCFlag ustar # ustar_PFP ustar_PFP_QCFlag ustar_QCFlag uu # uu_QCFlag uv uv_QCFlag uw # uw_QCFlag Ux Ux_QCFlag Ux_Sd # Ux_Sd_QCFlag UxA UxA_QCFlag UxC # UxC_QCFlag UxT UxT_QCFlag UxUx # UxUx_QCFlag UxUy UxUy_QCFlag UxUz # UxUz_QCFlag Uy Uy_QCFlag Uy_Sd # Uy_Sd_QCFlag UyA UyA_QCFlag UyC # UyC_QCFlag UyT UyT_QCFlag UyUy # UyUy_QCFlag UyUz UyUz_QCFlag Uz # Uz_QCFlag Uz_Sd Uz_Sd_QCFlag UzA # UzA_QCFlag UzC UzC_QCFlag UzT # UzT_QCFlag UzUz UzUz_QCFlag v # v_QCFlag Vbat Vbat_QCFlag VPD # VPD_QCFlag vv vv_QCFlag vw # vw_QCFlag w w_QCFlag wA # wA_QCFlag wC wC_QCFlag Wd # Wd_CSAT Wd_CSAT_QCFlag Wd_QCFlag Ws # Ws_CSAT Ws_CSAT_QCFlag Ws_QCFlag wT # wT_QCFlag ww ww_QCFlag xlDateTime # xlDateTime_QCFlag Year Year_QCFlag 这里读取的是未经过插值的 L3 通量数据,有缺值。如果要分析水碳通量的年月日变化特征,需要进行插值。 插值的方法可以参考,澳洲通量数据的处理方法简介: http://ozewex.org/ozfluxqc-flux-data-processing-tool/ 代码原文下载链接: read_nc.R
个人分类: 通量数据分析|3533 次阅读|0 个评论
[转载]Matlab 数据读取方法
JerryYe 2016-8-10 12:55
【Matlab】 读取文件各种方法 要得到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 2 12.02.2006 Limei Samples of datas: 50000 CH0 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); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 --------------------------------------------------------------------------------------- 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.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’)的区别请参阅精华贴: 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 转载,访问原作者: http://www.cnblogs.com/xianghang123/archive/2011/12/06/2277602.html .
个人分类: Matlab|2637 次阅读|0 个评论
[转载]【matlab】matlab文件操作fopen,fseek,fread,fclose等
JerryYe 2016-7-20 10:16
1、文件的打开与关闭 1)打开文件 在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为: fid=fopen(文件名,‘打开方式’) 说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:  ‘r’:只读方式打开文件(默认的方式),该文件必须已存在。  ‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。  ‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。  ‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。  ‘a’:在打开的文件末端添加数据。文件不存在则创建。  ‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。 另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。 2)关闭文件 文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为: sta=fclose(fid) 说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose(‘all’)。 2、二进制文件的读写操作 1)写二进制文件 fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为: COUNT=fwrite(fid,A,precision) 说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。 例6.8 将一个二进制矩阵存入磁盘文件中。 a= ; fid=fopen('d:test.bin','wb') %以二进制数据写入方式打开文件 fid = 3 %其值大于0,表示打开成功 fwrite(fid,a,'double') ans = 9 %表示写入了9个数据 fclose(fid) ans = 0 %表示关闭成功 2)读二进制文件 fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为: =fread(fid,size,precision) 说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、 (读数据到M×N的矩阵中,数据按列存放)。 precision用于控制所写数据的精度,其形式与fwrite函数相同。 3、文本文件的读写操作 1)读文本文件 fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为: =fscanf(fid,format,size) 说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、 (读数据到M×N的矩阵中,数据按列存放)。 matlab中的fscanf的用法如下: A=fscanf(fid,format) =fscanf(fid,format,size) =fscanf(fid,format,size) 个人感觉用的最多的是这样的形式: data = fscanf(fid,format,size); 其中data为读取内容的数组,它的大小由size决定。size是一个 的向量, m为行,n为列(注意,这里读取的顺序是按列优先排列的,不明白的话可以看 下面的例子),若n取inf表示读到文件末尾。fid为fopen打开文件的返回值, format是格式化参数(像printf、scanf)。 举个小例子: 路径+文件名:d:moon.txt 内容:13,1,3.4    3,2.1,23 1, 12, 2    4,5.4,6 现在为了读取moon.txt中的数据存在一个数组里,可以用如下方法: fid=fopen('d:moon.txt'); data=fscanf(fid,'%f,%f,%f', ) ;%这里得用单引号 fclose(fid); 这时data中的数据如下: (3行4列,matlab元素按照列的顺序排列) 13 3 1 4 1 2.1 12 5.4 4 23 2 6 通常我们可能需要用引用数组中的某行或某列来画图,方法是data(m,:) 或者 data(:,n),即取得data数组的第m行或第n列。 2)写文本文件 fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为: fprintf(fid,format,A) 说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。 例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。 a='string'; fid=fopen('d:char1.txt','w'); fprintf(fid,'%s',a); fclose(fid); fid1=fopen('d:char1.txt','rt'); b=fscanf(fid1,'%s') b = string matlab读txt文件 fid=fopen('fx.txt','r'); %得到文件号 =fscanf(fid,'%f %f', ); %把文件号1的数据读到f中。其中f是 的矩阵 %这里'%f %f'表示读取数据的形式,按原始数据型读出 fclose(fid); %关闭文件 另外有的txt文件还可以用load来打开 其语句为 f=load('fx.txt) 我个人觉得用第一种方式较好。因为有些时候,特别是fx.txt 的一行种有多个数据时用load就比较麻烦了。 4.数据文件定位 MATLAB提供了与文件定位操作有关的函数fseek和ftell。fseek函数用于定位文件位置指针,其调用格式为: status=fseek(fid, offset, origin) 其中fid为文件句柄,offset表示位置指针相对移动的字节数,OFFSET values are interpreted as follows: 0 Move toward the end of the file. = 0 Do not change position. 0 Move toward the beginning of the file. origin表示位置指针移动的参照位置,ORIGIN values are interpreted as follows: 'bof' or -1 Beginning of file 'cof' or 0 Current position in file 'eof' or 1 End of file。 若定位成功,status返回值为0,否则返回值为–1。 ftell函数返回文件指针的当前位置,其调用格式为: position=ftell (fid) 返回值为从文件开始到指针当前位置的字节数。若返回值为–1表示获取文件当前位置失败。 例: FID=fopen('sw.m','r') fseek(FID,10,-1) ans = 0 ftell(FID) ans = 10 fseek(FID,-10,1) ans = 0 ftell(FID) ans = 2180 文件指针可以移动到当前文件末尾的后面,但不能移动到开头的前面;当把指针移动到文件末尾后面时,若关闭文件则文件大小会自动增长到文件指针所指的大小,用这种方法可以很容易创建一个很大的文件, 当然新增加的文件内容是随机的。 【附录: matlab读取grd格式文件的源代码】 clc; clear all; close all; fid=fopen( ,'r'); head=fread(fid,4,'uint8=char')'; %读取文件头DSAA fscanf(fid,'n'); nx=fscanf(fid,'%d',1);%读取格网数据的行数nnx,列数nnz fp=fseek(fid,1,0); %1表示读取文件指针向后偏移1位,0表示指针移动参考当前位置 ny=fscanf(fid,'%d',1); fscanf(fid,'n'); xmin=fscanf(fid,'%f',1);%读取x的最小值和最大值 fseek(fid,4,1); %4表示读取文件指针向后偏移4位,1表示指针移动参考位置为文件结尾 xmax=fscanf(fid,'%f',1); fscanf(fid,'n'); ymin=fscanf(fid,'%f',1);%读取y的最小值和最大值 fseek(fid,4,1); ymax=fscanf(fid,'%f',1); fscanf(fid,'n'); zmin=fscanf(fid,'%f',1);%读取z的最小值和最大值 fseek(fid,4,1); zmax=fscanf(fid,'%f',1); fscanf(fid,'n'); for i=1:ny %注意matlab是按照列的顺序来存放数据的,先存第1列,然后第2列,依次到最后一列。 for m=1:nx vp(i,m)=fscanf(fid,'%f',1); fseek(fid,4,1); end fscanf(fid,'n'); end 转载本文请联系原作者获取授权,同时请注明本文来自科学网博客,链接地址: http://blog.sciencenet.cn/blog-51026-623674.html
个人分类: Matlab|3555 次阅读|0 个评论
C语言的数据读取
Jerkwin 2014-1-23 09:02
C 语言的数据读取 2014-01-19 12:26:49 大学时候我也学过谭浩强的 C 语言 , 很喜欢 C 的简洁与类数学模式 , 可后来实际工作时却一直用 Fortran, 没用 C 做过实在的工作 .Fortran 是古老了点 , 而且年纪大了很容易唠叨罗嗦 , 却也平易近人 , 不像 C 那样狂野不羁 , 胡乱指点 , 一不小心就落入陷阱 . 前几天需要使用 C 代码 , 写起来的时候才发现连最基本的文件读写都搞不定 . 利用 C 读取文本数据 , 总感觉比 Fortran 麻烦很多 , 还不直观 . 等我查阅了一下资料才发现 , 原来也是有路的 , 并没有我想得那么麻烦 . 可惜这些技巧好像课本上的时候从没说到过 . C 语音中最简单的文件读取函数是 fscanf, 相当于 Fortran 的 read, 使用起来稍微麻烦一点 , 主要是 fscanf 读文件不会自动换行 , 换行符也会读到 , 如果想略掉换行的 , 一行一行的读取 , 可利用 C 的格式控制 , 如下 Iret=fscanf(fp,%lf %lf %* , x, y); 这里我们以双精度格式 %lf 读入了两个 double 变量 x,y( 注意 , 必须使用 %lf 读取 double 变量 , 不可使用 %f), 然后忽略掉直到行尾的其他内容 , 同时整型 Iret 返回读取成功的次数 . * 表示忽略某项 , 用 和 %n 说明符的使用方法 http://blog.163.com/ghost_wzf/blog/static/89592171200931010646535/ 菜鸟求助:如何解释 fscanf(fd,%* ) http://bbs.csdn.net/topics/190113555
个人分类: 我的工具箱|6609 次阅读|0 个评论
NETCDF文件读取要点
zhoufcumt 2013-3-22 23:42
很多数据都以NETCDF或GRIB的格式出现,比如NCEP和ECMWF的数据基本是NETCDF的格式,读取这些数据的格式时,在linux下可以安装NETCDF库来读取,比如用fortran读取NCEP大气数据时,需要有这样一句, call readnetcdf(ncfile, 'pres', start,count,stride,press,time),这个‘pres’即为NCEP大气数据的关键字,那么对一个NETCDF格式的数据,如何获取这个关键字呢?这里就要用到一个很方便的工具ncdump: ncdump -c pres.sfc.2012.nc header.atmos 这样在header.atmos文件下将会有这样的信息: netcdf pres.sfc.2012 { dimensions: lat = 73 ; lon = 144 ; time = UNLIMITED ; // (1464 currently) variables: float lat(lat) ; lat:units = degrees_north ; lat:actual_range = 90.f, -90.f ; lat:long_name = Latitude ; lat:standard_name = latitude ; lat:axis = Y ; float lon(lon) ; lon:units = degrees_east ; lon:long_name = Longitude ; lon:actual_range = 0.f, 357.5f ; lon:standard_name = longitude ; lon:axis = X ; double time(time) ; time:units = hours since 1-1-1 00:00:0.0 ; time:long_name = Time ; time:actual_range = 17628096., 17636874. ; time:delta_t = 0000-00-00 06:00:00 ; time:standard_name = time ; time:axis = T ; short pres(time, lat, lon) ; pres:long_name = 4xDaily Pressure at surface ; pres:unpacked_valid_range = 40000.f, 115000.f ; pres:actual_range = 49030.f, 109490.f ; pres:units = Pascals ; pres:add_offset = 367650.f ; pres:scale_factor = 10.f ; pres:missing_value = 32766s ; pres:precision = -1s ; pres:least_significant_digit = -1s ; pres:GRIB_id = 1s ; pres:GRIB_name = PRES ; pres:var_desc = Pressure ; pres:dataset = NMC Reanalysis ; pres:level_desc = Surface ; pres:statistic = Individual Obs ; pres:parent_stat = Other ; pres:valid_range = -32765s, -25265s ; // global attributes: :Conventions = COARDS ; :title = 4x daily NMC reanalysis (2012) ; :history = created 2011/12 by Hoop (netCDF2.3) ; :description = Data is from NMC initialized reanalysis\n, (4x/day). It consists of most variables interpolated to\n, pressure surfaces from model (sigma) surfaces. ; :platform = Model ; :references = http://www.esrl.noaa.gov/psd/data/gridded/data.ncep.reanalysis.html ; short pres(time, lat, lon) ; 这句中的pres即为关键字。 pres:units = Pascals ; 这句即为气压数据的单位:帕斯卡。 下面还有经纬度格网信息、时间信息(时间的单位是小时, time:units = hours since 1-1-1 00:00:0.0 ),内容较多,显示不全,有兴趣的可以自己试验。 将NETCDF格式文件转化为可读文本文件: ncdump -bc pres.sfc.2012.nc atmos_ncep_2012.dat 但这样对于数据量大的数据比较耗时,不建议这样做,还是尽量用NETCDF的库完成NETCDF格式文件的读取。 NOTE:在当前数据目录下必须有类似动态库文件 libnetcdf.so.7!
个人分类: 数据格式|16035 次阅读|0 个评论
NetCDF格式的数据读取(Matlab)
热度 1 zheyang 2011-7-14 14:34
近来在了解cosmic掩星电离层数据资料时,遇到了数据读取问题,该数据为NetCDF(Network Common Data Form)格式的数据,通过查找资料与不断摸索数据读取的问题终于得以解决。 首先介绍一下NetCDF格式,NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。对程序员来说,它和zip、jpeg、bmp文件格式类似,都是一种文件格式的标准。netcdf文件开始的目的是用于存储气象科学中的数据,现在已经成为许多数据采集软件的生成文件的格式。利用NetCDF可以对网格数据进行高效地存储、管理、获取和分发等操作。由于其灵活性,能够传输海量的面向阵列(array-oriented)数据,目前广泛应用于大气科学、水文、海洋学、环境模拟、地球物理等诸多领域,例如,NCEP(美国国家环境预报中心)发布的再分析资料,NOAA的CDC(气候数据中心)发布的海洋与大气综合数据集(COADS)均采用NetCDF作为标准 。 (摘自百度百科) 起初在网上找了很多关于nc格式数据读取的资料,读取的方式有很多,最后选择利用Matlab语言进行读取,网上提供的方法之一( http://blogold.chinaunix.net/u/ 17182/showart_103606.html ) 。由于 台式机上matlab版本为R2009b,该方法 在matlab中总是报错;后来改在笔记本上运行(matlab版本为R2007b),居然可以正常读取了,最后得出结论:Matlab版本问题,此方法提供的插件只适用于低版本的Matlab。 虽然数据可以正常读取了,但是为了解决nc格式数据在高版本matlab上的读取问题,又查找了很多资料。介绍NetCDF的官方网站为 http://www.unidata.ucar.edu/software/netcdf/index.html , 相关的说明文件请参考该网站 http://www.unidata.ucar.edu/software/netcdf/docs/ 。 随着Matlab版本的不断更新,用于读取NecCDF数据的matlab插件也在不断更新,适用于不同版本的nc插件可以在 http://sourceforge.net/projects/mexcdf/files/ 此网站上下载得到。 适用于Matlab2008b之后版本的nc文件插件名为mexcdf,最新版本为mexcdf.r3606,将该压缩文件解压后得到mexcdf及snctools两个文件。但是为了更加直观的了解nc文件信息,需要配合netcdf_toolbox这个工具箱使用。关于这些插件在matlab上的安装说明可以详见各解压缩文件夹下的自述文件(README)。有关matlab读取netcdf数据一些命令函数可以help netcdf。如果需要批量处理该格式文件,则需要编写批处理程序。 nc格式数据的读取问题已经解决,但是有些问题理解的还不够深入,希望通过不断的学习能够得以逐步提高。
个人分类: 专业学习笔记|5918 次阅读|1 个评论

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

GMT+8, 2024-6-2 05:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部