数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 6090|回复: 0

大量数据文件的输入输出的批处理问题(matlab)[原]

[复制链接]
发表于 2007-8-25 13:41:57 | 显示全部楼层 |阅读模式
面对最近几年数据题越来越多,很多朋友都会问“批处理”怎么做,下面就基于matlab的输入输出函数,写一些个人看法。
    我们以2005年的C题为例(C2005data)先说说这个数据的文件夹结构,X:\C2005data\FORECAST\下面有330个文件,328个数据文件,2个网格文件表示精度、维度;X:\C2005data\MEASURING内有41个数据文件。可能我是学气象学的,对于这个数据比较敏感,也积累了一些处理经验。
【下面的话引自原文】【BEGIN】
    FORECAST中的文件lon.dat和lat.dat分别包含网格点的经纬度,其余文件名为<f日期i>_dis1和<f日期i>_dis2,例如f6181_dis1中包含2002年6月18日晚上20点采用第一种方法预报的第一时段数据(其2491个数据为该时段各网格点的雨量),而f6183_dis2中包含2002年6月18日晚上20点采用第二种方法预报的第三时段数据。MEASURING中包含了41个名为<日期>.SIX的文件,如020618.SIX表示2002年6月18日晚上21点开始的连续4个时段各站点的实测数据(雨量),这些文件的数据格式是:
站号      纬度      经度           第1段     第2段     第3段      第4段
58138     32.9833    118.5167         0.0000     0.2000      10.1000      3.1000
58139     33.3000    118.8500         0.0000     0.0000       4.6000      7.4000
58141     33.6667    119.2667         0.0000     0.0000       1.1000      1.4000
58143     33.8000    119.8000         0.0000     0.0000       0.0000      1.8000
58146     33.4833    119.8167         0.0000     0.0000       1.5000      1.9000
【END】
i.现在我们就来处理这个数据读取问题(为方便起见,经纬度数据没读取):
%method 1:
clear,clc
cd E:\data_space\C2005data\FORECAST\    %文件所在文件夹。
dat=struct2cell(dir);      %建立文件夹的树结构
for i=1:length(dat)-2      %减去2是由dos文件夹的组织决定的,这里不做解释
    data{i}=importdata(dat{1,i+2});  %使用元胞数组存储各文件中的内容。
end
结果如下:data{1}(f6181_dis1文件)
ans =
    0.0310    0.0321    0.0313    0.0307    0.0309    0.0331    0.0314    0.0336...
    0.0302    0.0310    0.0315    0.0319    0.0330    0.0336    0.0335    0.0334...
......
上面也可以考虑使用结构体数组或元胞数组把文件名和寄存数据的元胞数组进行合并,使得文件信息直观化。

%method 2:
clear,clc
cd E:\C2005data\MEASURING\    %文件所在文件夹。
dat=dir('E:\C2005data\MEASURING\'); %读取文件名,同时dat也是寄存文件名的结构体
for i=1:length(dat)-2
    data{i}=importdata(dat(i+2).name); %元胞data即寄存了文件夹中的所有文件数据
end
结果如下:
ans =
  1.0e+004 *
    5.8138    0.0033    0.0119         0         0         0    0.0002
    5.8139    0.0033    0.0119         0         0         0         0
…………
接下来,我们只需对于元胞或结构体操作就可以达到目的了。

ii.多文件的输出:
考虑这个问题,我们必须先生成一个可以产生连续整数序列的函数生成注入001、002、003、……、999类似整数。
我写了一个,作为参考:
function b=fullnum(n)
if n~=floor(n)||n<=0||n>9999
    fprintf('Error:The number is not allowed float-point,less than 0 or larger than 9999!\n');
    return;
end
b={};
for i=1:n
    if i<10^floor(log10(n))
        b{i}=strcat(char(ones(1,floor(log10(n))-floor(log10(i)))*48),int2str(i));%生成文件名序列;
    else
        b{i}=int2str(i);
    end
end
end
下面使用类似这个的模板,存储一个元胞数组的内容到一系列连续文件名的文件:
mkdir F:\data  %需要输出的文件夹
name=fullnum(41); %输出文件的个数
for i=1:41
    a=data{i};
    save(strcat('F:\data\data',name{i},'.txt'),'a','-ascii');
end
iii.格式输出问题
上面的程序是不可以格式输出的,matlab中是什么形式,文件就是什么形式,但有时我们不得不采取格式输出的原则,下面提供一个程序:
原始文件结构:
data =
  1.0e+004 *
  Columns 1 through 8
    0.1971    0.0001    1.0240    0.0038   -0.0042    0.0040         0    0.0001
    0.1971    0.0002    1.0219    0.0039   -0.0028    0.0046         0    0.0001
......

data=importdata('E:\Data_Space\beijing.mat');
%data1,2---年月
%data3---气压(hPa)
%data4---风速(m/s)
%data5---气温(`C)
%data6---相对湿度(%)
%data7---降水量(mm)
%data8---平均日照百分率(%)
%data9---地表总辐射月均值(MJ/d)
%data10---大气上届天文辐射月均值(MJ/d)
data(:,[3 4 5 7])=0.1*data(:,[3 4 5 7]); %数据不寄存小数,需要对部分列进行预处理
data(:,6)=0.01*data(:,6);
format='%d %2d %10.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n';
fid = fopen('E:\exp.txt','wt');
fprintf(fid,format,data');
fclose(fid)
这个程序自己看matlab帮助,不予以解释。
输出在E:\exp.txt中的文件格式
年    月    气压      风速     气温   相对湿度   降水量   百分率  总辐射    天文
1971  1   1024.035    3.810   -4.242    0.399    0.000    0.702    9.873   15.968
1971  2   1021.914    3.864   -2.836    0.462    0.000    0.565   10.981   21.236
…………
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 09:58 , Processed in 0.053809 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表