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步;第四步我是在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#编程语言批量读取文件信息;的主要内容,如果未能解决你的问题,请参考以下文章
python 调用HEG工具批量处理modis数据将hdf转为tif