MODIS批量文件名获取时间信息;使用C#编程语言批量读取文件信息;

Posted 殷孟珂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MODIS批量文件名获取时间信息;使用C#编程语言批量读取文件信息;相关的知识,希望对你有一定的参考价值。

话不多说,先放上源代码,不想看下面的具体的解析过程的直接Copy源代码即可。(麻烦Copy给点个赞再再走忙)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Modis名称获取
{
    class Program
    {
        static void Main(string[] args)
        {

            string path = @"H:\\Moids数据\\MOD02";
            //Modis数据的文件夹路径
            string[] nums = Directory.GetFiles(path);
            //获得Modis数据的路径+文件名+扩展名
            string[] newnums = new string[2];
            //用于去除年份天数和小时分钟之间的.
            string[] years = new string[nums.Length];
            //创建一个数字用于存贮年的时间
            string[] days = new string[nums.Length];
            //创建一个数字用于存贮天数
            string[] hours = new string[nums.Length];
            //创建一个数字用于存贮小时
            string[] minutes = new string[nums.Length];
            //创建一个数字用于存贮分钟
            string[] seconds = new string[nums.Length];
            //创建一个数字用于存贮秒


            for (int i = 0; i < nums.Length; i++)
            {
                nums[i] = Path.GetFileNameWithoutExtension(nums[i]);
                //获得数据的文件名
                seconds[i] = nums[i].Substring(nums[i].Length - 2);
                nums[i] = nums[i].Substring(nums[i].IndexOf('.') + 2, 12);
                //获得数据的年份和天数
                newnums = nums[i].Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
                //在.分隔两个字符串
                nums[i] = newnums[0] + newnums[1];
                //重新赋值给nums
            }

    
            for (int i = 0; i < nums.Length; i++)
            {
                years[i] = nums[i].Substring(0, 4);
                //获得年份数据
                days[i] = nums[i].Substring(4, 3);
                //获得天数数据
                hours[i] = nums[i].Substring(7, 2);
                //获得小时数据
                minutes[i] = nums[i].Substring(9);
                //获得分钟据
            }
            using (FileStream fswrite = new FileStream(@"C:\\Users\\lenovo\\Desktop\\Modis时间数据.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                string time = null;
                for (int i = 0; i < nums.Length; i++)
                {
                    time = years[i] + "年" + days[i] + "天" + hours[i] + "时" + minutes[i] + "分" + seconds[i] + "秒" + "#";
                    //#为换行符,复制数据到Word中换行
                    byte[] buffer = Encoding.UTF8.GetBytes(time);
                    //byte[] buffer = Encoding.UTF8.GetBytes(nums[i]+"#");
                    fswrite.Write(buffer, 0, buffer.Length);
                }
            }
            Console.WriteLine("写入成功");
            Console.ReadKey();
        }
    }
}

多图警告

笔者在校学习期间,由于科研项目需要,下载了大量的MODIS02 1KM数据。如下图所示
在这里插入图片描述

以任意MODIS文件为例,解析下对应的命名规则

MOD021KM.A2019060.0405.061.2019060131711.hdf
MOD021KM.AXXXXYYY.ZZHH.061.20190601317WW.hdf
XXXX代表年
YYY代表天数
ZZ代表小时
HH代表分钟
WW代表秒
其中MODIS021KM代码遥感数据名称
2019代价拍摄时间为2019年
060代表从天数为2019年的第60天
04代表拍摄时间为04时
05代表拍摄时间为05分
11代表拍摄时间为

根据2019年信息换算 即为2019年03月01日04时05分11秒

需要满足我的需求,一共需要完成一下几步

  1. 创建一个数组,读取文件夹中的各个数据的文件名。
  2. 对文件名进行提取,去除掉无用的信息
  3. 对获取的信息进行分类(分为年天时分秒)
  4. 对天数进行换算,将其转换为月份信息

首先,我的代码里面只完成了第1、2、3步;第四步我是在Excel中完成的

源代码文件的注释信息中已经给出了各行代码的含义,这里不再进行赘述

注意:由于不同系统中的换行符不同
eg:\\r\\n或者\\n等
故笔者没有在代码中最后生成的txt文件进行换行
而是在代码中每一个行添加了一个“#”字符
如果需要换行,可在Word中复制所有信息,使用Word中的替换功能,将所有的”#“替换成”^p“即可

代码运行成功,会在控制台输出“写入成功”
在这里插入图片描述

-笔者的数据文件夹路径为“D:\\百度云下载\\MODIS”;
桌面路径为“C:\\Users\\lenovo\\Desktop\\”
生成的文件名为“Modis时间数据.txt”
在这里插入图片描述
Ctrl+C 复制所有内容粘贴至Word中
在这里插入图片描述
使用“替换”功能
在这里插入图片描述
Copy所有内容,新建Excle,粘贴过去,使用“分列功能”
在这里插入图片描述
在Excel分列后,使用函数功能,将天数化为具体的月份
在这里插入图片描述
在这里插入图片描述
最终得到了想要的文件

有朋友问到,Excle第一列的文件全名是怎么得到的
Copy如下代码即可(注释了部分行)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Modis名称获取
{
    class Program
    {
        static void Main(string[] args)
        {

            string path = @"D:\\百度云下载\\MODIS";
            //Modis数据的文件夹路径
            string[] nums = Directory.GetFiles(path);
            //获得Modis数据的路径+文件名+扩展名

            for (int i = 0; i < nums.Length; i++)
            {
                nums[i] = Path.GetFileNameWithoutExtension(nums[i]);
                //获得数据的文件名
            }
            using (FileStream fswrite = new FileStream(@"C:\\Users\\lenovo\\Desktop\\Modis时间数据.txt", FileMode.OpenOrCreate, FileAccess.Write))
            {
                string time = null;
                for (int i = 0; i < nums.Length; i++)
                {
                    //time = years[i] + "年" + days[i] + "天" + hours[i] + "时" + minutes[i] + "分" + seconds[i] + "秒" + "#";
                    #为换行符,复制数据到Word中换行
                    //byte[] buffer = Encoding.UTF8.GetBytes(time);
                    byte[] buffer = Encoding.UTF8.GetBytes(nums[i]+"#");
                    fswrite.Write(buffer, 0, buffer.Length);
                }
            }
            Console.WriteLine("写入成功");
            Console.ReadKey();
        }
    }
}

以上是关于MODIS批量文件名获取时间信息;使用C#编程语言批量读取文件信息;的主要内容,如果未能解决你的问题,请参考以下文章

c#如何批量获取一个文件夹下的文件属性,然后存入数据库

python 调用HEG工具批量处理modis数据将hdf转为tif

MRT(MODIS Reprojection Tool)安装影像批量拼接重投影和格式转换

C# 微信开发 怎么批量获取用户信息?

常见气象数据获取方式及批量下载代码汇总

C#实现文件批量重命名源码下载