利用MATLAB提取气象站降水数据到现有的EXCEL表中

% 定义目录路径
inputDir = 'D:\气象数据\1988-2018年\总\PRE';
outputDir = 'D:\气象数据\陕西';

% 创建输出目录(如果不存在)
if ~exist(outputDir, 'dir')
    mkdir(outputDir);
end

% 获取所有.txt文件
txtFiles = dir(fullfile(inputDir, '*.txt'));

% 遍历每个.txt文件
for k = 1:length(txtFiles)
    % 读取当前.txt文件
    filePath = fullfile(inputDir, txtFiles(k).name);
    disp(['Processing file: ', filePath]);

    % 读取数据
    fid = fopen(filePath, 'r');
    C = textscan(fid, '%s', 'Delimiter', '\n');
    fclose(fid);

    % 将每行数据分割并转换为表格
    data = cellfun(@(x) str2double(strsplit(x)), C{1}, 'UniformOutput', false);
    data = vertcat(data{:});
    data = array2table(data, 'VariableNames', {'StationID', 'Param1', 'Param2', 'Param3', 'Year', 'Month', 'Day', 'Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6'});

    % 获取气象站号列表
    uniqueStations = unique(data.StationID);

    % 遍历每个气象站
    for i = 1:length(uniqueStations)
        stationID = uniqueStations(i);

        % 筛选出当前气象站的数据
        stationData = data(data.StationID == stationID, :);

        % 生成输出文件路径
        outputFilePath = fullfile(outputDir, [num2str(stationID), '.xlsx']);

        % 如果文件已存在,则追加数据
        if isfile(outputFilePath)
            % 获取现有数据的行数
            [~, ~, existingData] = xlsread(outputFilePath);
            numRows = size(existingData, 1);
            % 将新数据追加到现有数据的后面
            writetable(stationData, outputFilePath, 'WriteVariableNames', false, 'Range', ['A' num2str(numRows + 1)]);
        else
            % 如果文件不存在,则创建新文件
            writetable(stationData, outputFilePath);
        end
    end
end

disp('数据提取完成。');

这段代码是用于处理气象数据的脚本,它的功能包括:

1. 定义输入和输出目录路径。
2. 创建输出目录(如果不存在)。
3. 获取指定目录下的所有 `.txt` 文件。
4. 遍历每个 `.txt` 文件,读取其中的数据。
5. 将每行数据分割并转换为表格格式。
6. 获取每个气象站的唯一标识符。
7. 针对每个气象站,筛选出对应的数据。
8. 根据气象站的唯一标识符生成输出文件路径,并将数据写入到对应的文件中。如果文件已存在,则追加数据。

下面是代码的详细解析:

```matlab
% 定义目录路径
inputDir = 'D:\气象数据\1988-2018年\总\PRE';
outputDir = 'D:\气象数据\陕西';

% 创建输出目录(如果不存在)
if ~exist(outputDir, 'dir')
    mkdir(outputDir);
end

% 获取所有.txt文件
txtFiles = dir(fullfile(inputDir, '*.txt'));

% 遍历每个.txt文件
for k = 1:length(txtFiles)
    % 读取当前.txt文件
    filePath = fullfile(inputDir, txtFiles(k).name);
    disp(['Processing file: ', filePath]);

    % 读取数据
    fid = fopen(filePath, 'r');
    C = textscan(fid, '%s', 'Delimiter', '\n');
    fclose(fid);

    % 将每行数据分割并转换为表格
    data = cellfun(@(x) str2double(strsplit(x)), C{1}, 'UniformOutput', false);
    data = vertcat(data{:});
    data = array2table(data, 'VariableNames', {'StationID', 'Param1', 'Param2', 'Param3', 'Year', 'Month', 'Day', 'Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6'});

    % 获取气象站号列表
    uniqueStations = unique(data.StationID);

    % 遍历每个气象站
    for i = 1:length(uniqueStations)
        stationID = uniqueStations(i);

        % 筛选出当前气象站的数据
        stationData = data(data.StationID == stationID, :);

        % 生成输出文件路径
        outputFilePath = fullfile(outputDir, [num2str(stationID), '.xlsx']);

        % 如果文件已存在,则追加数据
        if isfile(outputFilePath)
            % 获取现有数据的行数
            [~, ~, existingData] = xlsread(outputFilePath);
            numRows = size(existingData, 1);
            % 将新数据追加到现有数据的后面
            writetable(stationData, outputFilePath, 'WriteVariableNames', false, 'Range', ['A' num2str(numRows + 1)]);
        else
            % 如果文件不存在,则创建新文件
            writetable(stationData, outputFilePath);
        end
    end
end

disp('数据提取完成。');
```

这段代码用到了一些 MATLAB 的基本功能,如文件操作、文本处理、数据分析和写入文件等。例如,`dir` 函数用于列出指定目录下的文件,`textscan` 函数用于从文本文件中读取数据,`writetable` 函数用于将表格数据写入到文件中等。

举例说明用法:

假设有一个输入目录 `D:\气象数据\1988-2018年\总\PRE`,其中包含多个 `.txt` 文件,每个文件中包含气象数据,格式如下:

```
1001 0 0 0 1988 1 1 10.2 20.3 30.4 40.5 50.6 60.7
1001 0 0 0 1988 1 2 11.2 21.3 31.4 41.5 51.6 61.7
...
```

运行上述代码,它会读取每个 `.txt` 文件中的数据,并根据气象站的唯一标识符将数据写入到对应的输出文件中。例如,对于气象站号为 `1001` 的数据,会在输出目录 `D:\气象数据\陕西` 下生成一个名为 `1001.xlsx` 的 Excel 文件,其中包含该气象站的数据。如果输出文件已存在,则会追加数据到现有文件中。

这样,你就可以用这段代码处理气象数据,将数据按照气象站分组并写入到不同的 Excel 文件中,方便进行后续的分析和处理。

好的,让我解释每个函数的含义、用法,并给出一个具体的例子。

1. `exist`: 这个函数用于检查文件或目录是否存在。
   - 用法:`exist(path, 'dir')` 可以检查指定路径是否为目录。
   - 示例:`exist(outputDir, 'dir')` 会检查指定的输出目录是否存在。

2. `mkdir`: 这个函数用于创建新目录。
   - 用法:`mkdir(path)` 会在指定路径下创建新目录。
   - 示例:`mkdir(outputDir)` 会在指定的输出目录下创建新目录。

3. `dir`: 这个函数用于列出指定目录中的文件和文件夹。
   - 用法:`dir(path)` 会返回一个结构数组,包含指定目录中的文件和文件夹信息。
   - 示例:`txtFiles = dir(fullfile(inputDir, '*.txt'))` 会列出输入目录下所有的 `.txt` 文件。

4. `fullfile`: 这个函数用于构建文件路径。
   - 用法:`fullfile(path1, path2, ...)` 可以将多个路径组合成一个完整的路径。
   - 示例:`filePath = fullfile(inputDir, txtFiles(k).name)` 会构建出指定文件的完整路径。

5. `fopen`: 这个函数用于打开文件。
   - 用法:`fid = fopen(filename, permission)` 可以打开指定文件,并返回一个文件标识符。
   - 示例:`fid = fopen(filePath, 'r')` 会打开指定路径的文件以供读取。

6. `fclose`: 这个函数用于关闭文件。
   - 用法:`fclose(fid)` 可以关闭指定文件标识符所代表的文件。
   - 示例:`fclose(fid)` 会关闭之前打开的文件。

7. `textscan`: 这个函数用于从文本文件中读取数据。
   - 用法:`C = textscan(fid, formatSpec)` 可以根据指定的格式从文件中读取数据,并以单元格数组的形式返回。
   - 示例:`C = textscan(fid, '%s', 'Delimiter', '\n')` 会从文件中读取每行文本数据。

8. `cellfun`: 这个函数用于对单元格数组中的每个元素应用一个函数。
   - 用法:`cellfun(@(x) function(x), cellArray)` 可以对单元格数组中的每个元素应用指定的匿名函数。
   - 示例:`cellfun(@(x) str2double(strsplit(x)), C{1}, 'UniformOutput', false)` 会将每行文本数据分割并转换为数值。

9. `vertcat`: 这个函数用于垂直拼接数组。
   - 用法:`C = vertcat(A, B)` 可以将两个数组按垂直方向拼接。
   - 示例:`data = vertcat(data{:})` 会将单元格数组中的元素垂直拼接成一个大数组。

10. `array2table`: 这个函数用于将数组转换为表格。
    - 用法:`T = array2table(A, 'VariableNames', varNames)` 可以将数组转换为表格,指定变量名。
    - 示例:`data = array2table(data, 'VariableNames', {'StationID', 'Param1', ...})` 会将数组转换为表格,指定列变量名。

11. `unique`: 这个函数用于获取数组中的唯一值。
    - 用法:`B = unique(A)` 可以获取数组 A 中的唯一值,并按升序排列。
    - 示例:`uniqueStations = unique(data.StationID)` 会获取气象站的唯一标识符。

12. `isfile`: 这个函数用于检查文件是否存在。
    - 用法:`TF = isfile(filename)` 可以检查指定文件是否存在。
    - 示例:`isfile(outputFilePath)` 会检查输出文件是否存在。

13. `xlsread`: 这个函数用于从 Excel 文件中读取数据。
    - 用法:`[num, txt, raw] = xlsread(filename)` 可以从 Excel 文件中读取数值、文本和原始数据。
    - 示例:`[~, ~, existingData] = xlsread(outputFilePath)` 会读取现有 Excel 文件中的数据。

14. `writetable`: 这个函数用于将表格数据写入到文件中。
    - 用法:`writetable(T, filename)` 可以将表格 T 中的数据写入到指定文件中。
    - 示例:`writetable(stationData, outputFilePath)` 会将数据写入到指定的输出文件中。

这些函数在 MATLAB 中是常用的文件和数据处理函数,通过它们可以实现文件的读取、写入以及数据的处理和分析。

% 定义目录路径
inputDir = 'D:\气象数据\1988-2018年\总\PRE';
outputDir = 'D:\气象数据\陕西';

% 创建输出目录(如果不存在)
if ~exist(outputDir, 'dir')
    mkdir(outputDir);
end

% 获取所有.txt文件
txtFiles = dir(fullfile(inputDir, '*.txt'));

% 遍历每个.txt文件
for k = 1:length(txtFiles)
    % 读取当前.txt文件
    filePath = fullfile(inputDir, txtFiles(k).name);
    disp(['Processing file: ', filePath]);

    % 读取数据
    fid = fopen(filePath, 'r');
    C = textscan(fid, '%s', 'Delimiter', '\n');
    fclose(fid);

    % 将每行数据分割并转换为表格
    data = cellfun(@(x) str2double(strsplit(x)), C{1}, 'UniformOutput', false);
    data = vertcat(data{:});
    data = array2table(data, 'VariableNames', {'StationID', 'Param1', 'Param2', 'Param3', 'Year', 'Month', 'Day', 'Value1', 'Value2', 'Value3', 'Value4', 'Value5', 'Value6'});

    % 获取气象站号列表
    uniqueStations = unique(data.StationID);

    % 遍历每个气象站
    for i = 1:length(uniqueStations)
        stationID = uniqueStations(i);

        % 筛选出当前气象站的数据
        stationData = data(data.StationID == stationID, :);

        % 生成输出文件路径
        outputFilePath = fullfile(outputDir, [num2str(stationID), '.xlsx']);

        % 如果文件已存在,则追加数据
        if isfile(outputFilePath)
            % 获取现有数据的行数
            [~, ~, existingData] = xlsread(outputFilePath);
            numRows = size(existingData, 1);
            % 将新数据追加到现有数据的后面
            writetable(stationData, outputFilePath, 'WriteVariableNames', false, 'Range', ['A' num2str(numRows + 1)]);
        else
            % 如果文件不存在,则创建新文件
            writetable(stationData, outputFilePath);
        end
    end
end

disp('数据提取完成。');
 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

___Y1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值