2018-05-14 16:42:22 Lost_Innocent 阅读数 611

CSV是一种通用的、以纯文本形式存储表格数据的文件格式,通常以逗号作为分隔符。

下面介绍.Net Framework中的一种通用提取方式:

        static void Main(string[] args)
        {
            List<string> columns;
            List<Dictionary<string, string>> myData = GetData(out columns);
            foreach (string column in columns)
            {
                Console.Write("{0,-20}", column);
            }
            Console.WriteLine();
            foreach (Dictionary<string, string> row in myData)
            {
                foreach (string column in columns)
                {
                    Console.Write("{0,-20}", row[column]);
                }
                Console.WriteLine();
            }

            Console.ReadKey();
        }
        /// <summary>
        /// 从CSV中提取数据
        /// </summary>
        /// <param name="columns"></param>
        /// <returns></returns>
        private static List<Dictionary<string, string>> GetData(out List<string> columns)
        {
            string line;
            string[] stringArray;
            char[] charArray = new char[] { ',' };
            List<Dictionary<string, string>> data = new List<Dictionary<string, string>>();
            columns = new List<string>();
            try
            {
                FileStream aFile = new FileStream(@"..\..\SomeData.txt", FileMode.Open);
                StreamReader sr = new StreamReader(aFile, Encoding.Default);
                line = sr.ReadLine();//读取第一行
                stringArray = line.Split(charArray);
                //从第一行中获取列名
                for (int x = 0; x <= stringArray.GetUpperBound(0); x++)
                {
                    columns.Add(stringArray[x]);
                }
                //读取每一行的数据,填充到Dictionary<string,string>中
                line = sr.ReadLine();
                while (line != null)
                {
                    stringArray = line.Split(charArray);
                    Dictionary<string, string> dataRow = new Dictionary<string, string>();
                    for (int x = 0; x <= stringArray.GetUpperBound(0); x++)
                    {
                        dataRow.Add(columns[x], stringArray[x]);
                    }
                    data.Add(dataRow);
                    line = sr.ReadLine();

                }
                sr.Close();
                return data;
            }
            catch (Exception)
            {
                throw;
            }


2014-08-07 10:46:41 u010771437 阅读数 3249

主要内容: C#遍历文件(夹)、读取tar.gz格式压缩文件,提取信息(后续会读取各种格式遥感影像的元数据)并批量建库入库(Access)。不废话了,上代码(将近900行,但很多有待优化)(每天早上8点到晚上22点一直对着电脑呢,期间两三个小时的吃饭午休时间,对不起我的眼睛呀 ):

using System;
using System.IO;
using System.IO.Compression;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections; 
using System.Data;
using System.Data.OleDb;
using ADOX;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;

namespace ConsoleApplication2
{
    class Program
    {
        /**********解压函数**********/
      
        //public static void ZipToFile(string path, string addres)
        //{
        //    ZipInputStream s = new ZipInputStream(File.OpenRead(path));
        //    ZipEntry fileEntry;
        //    while ((fileEntry = s.GetNextEntry()) != null)
        //    {
        //        string filename = Path.GetFileName(fileEntry.Name);
        //        if (filename != "")
        //        {
        //            filename = addres + "\\" + filename;
        //            FileStream streamWriter = File.Create(filename);
        //            int size = 2048;
        //            byte[] buffer = new byte[s.Length];

        //            size = s.Read(buffer, 0, size);
        //            streamWriter.Write(buffer, 0, size);
        //            streamWriter.Close();
        //        }
        //    }
        //    s.Close();
        //}



        public static List<string> getModTarGzFileNames(string TargetFile, string fileDir)
        {
            List<string> modfiles = new List<string>();
            string rootFile = " ";
            string filepath = Path.Combine(fileDir, TargetFile);

            //读取压缩文件(zip文件),准备解压缩
            GZipInputStream gzs = new GZipInputStream(File.OpenRead(filepath.Trim()));

            string tarfilename = Path.Combine(fileDir, Path.GetFileNameWithoutExtension(TargetFile));


            FileStream destFile = File.Open(tarfilename, FileMode.Create);
            try
            {
                int buffersize = 2048;//缓冲区的尺寸,一般是2048的倍数
                byte[] FileData = new byte[buffersize];//创建缓冲数据
                while (buffersize > 0)//一直读取到文件末尾
                {
                    buffersize = gzs.Read(FileData, 0, buffersize);//读取压缩文件数据
                    destFile.Write(FileData, 0, buffersize);//写入目标文件
                }
            }
            catch (Exception ee)
            {
                Console.WriteLine(ee.Message);
            }
            destFile.Close();//关闭目标文件
            gzs.Close();//关闭压缩文件


            TarInputStream s = new TarInputStream(File.OpenRead(tarfilename.Trim()));


            //ZipInputStream();
            TarEntry theEntry;
            string path = fileDir;
            //解压出来的文件保存的路径


            string rootDir = " ";
            //根目录下的第一个子文件夹的名称
            while ((theEntry = s.GetNextEntry()) != null)
            {
                rootDir = Path.GetDirectoryName(theEntry.Name);
                //得到根目录下的第一级子文件夹的名称
                if (rootDir.IndexOf("\\") >= 0)
                {
                    rootDir = rootDir.Substring(0, rootDir.IndexOf("\\") + 1);
                }
                string dir = Path.GetDirectoryName(theEntry.Name);
                //根目录下的第一级子文件夹的下的文件夹的名称
                string fileName = Path.GetFileName(theEntry.Name);

                if (fileName != "")
                {
                    modfiles.Add(fileName);
                }

            }
            s.Close();

            File.Delete(tarfilename);
            return modfiles;
        }

        //给出某年的第几天转换成年月日表示 Day一个示例:A2010106
        public static string DayToDate(string Day)
        {
            char[] ch = Day.ToCharArray();
            string Date = "ch[1]" + "ch[2]" + "ch[3]" + "ch[4]";
            int year = (ch[1] - '0') * 1000 + (ch[2] - '0') * 100 + (ch[3] - '0') * 10 + (ch[4] - '0');
            Date = year.ToString() + "年";
            int day = (ch[5] - '0') * 100 + (ch[6] - '0') * 10 + (ch[7] - '0');
             int month=0,date=0;
            if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
            {
                //闰年
                if (day >= 1 && day <= 31)
                { 
                    month = 1;
                    date = day; 
                }
                else if(day>=32&&day<=60)
                      { 
                    month = 2;
                    date = day-31; 
                     }
                else if (day >= 61 && day <=91)
                {
                    month = 3;
                    date = day - 60;
                }
                else if (day >= 92 && day <= 121)
                {
                    month = 4;
                    date = day - 91;
                }
                else if (day >=122 && day <= 152)
                {
                    month = 5;
                    date = day - 121;
                }
                else if (day >= 153 && day <= 182)
                {
                    month = 6;
                    date = day - 152;
                }
                else if (day >= 183 && day <= 213)
                {
                    month = 7;
                    date = day - 182;
                }
                else if (day >= 214 && day <= 244)
                {
                    month = 8;
                    date = day - 213;
                }
                else if (day >= 245 && day <= 274)
                {
                    month = 9;
                    date = day - 244;
                }
                else if (day >= 275 && day <= 305)
                {
                    month = 10;
                    date = day - 274;
                }
                else if (day >= 306 && day <= 335)
                {
                    month = 11;
                    date = day - 305;
                }
                else if (day >= 336 && day <= 366)
                {
                    month = 12;
                    date = day - 335;
                }
            }
            else
            {
                //非闰年
                if (day >= 1 && day <= 31)
                {
                    month = 1;
                    date = day;
                }
                else if (day >= 32 && day <= 59)
                {
                    month = 2;
                    date = day - 31;
                }
                else if (day >= 60 && day <= 90)
                {
                    month = 3;
                    date = day - 59;
                }
                else if (day >= 91 && day <= 120)
                {
                    month = 4;
                    date = day - 90;
                }
                else if (day >= 121 && day <= 151)
                {
                    month = 5;
                    date = day - 120;
                }
                else if (day >= 152 && day <= 181)
                {
                    month = 6;
                    date = day - 151;
                }
                else if (day >= 182 && day <= 212)
                {
                    month = 7;
                    date = day - 181;
                }
                else if (day >= 213 && day <= 243)
                {
                    month = 8;
                    date = day - 212;
                }
                else if (day >= 244 && day <= 273)
                {
                    month = 9;
                    date = day - 243;
                }
                else if (day >= 274 && day <= 304)
                {
                    month = 10;
                    date = day - 273;
                }
                else if (day >= 305 && day <= 334)
                {
                    month = 11;
                    date = day - 304;
                }
                else if (day >= 335 && day <= 365)
                {
                    month = 12;
                    date = day - 334;
                }
            }
            Date += month.ToString() + "月" + date.ToString() + "日";

            return Date;
        }

        static void Main(string[] args)
        {
            #region "已注释:TEST"
            //string filePath = @"E:\DATA02\AVHRR\1149891193\001\NSS.GHRR.NJ.D99001.S0258.E0451.B2063738.WI";
            //string fullFileName = System.IO.Path.GetFileName(filePath);
            //int position = fullFileName.IndexOf("WI");
            //string fileName = fullFileName.Substring(0, position - 1);
            //Console.WriteLine("文件名:");
            //Console.WriteLine(fileName);
            //Console.WriteLine("带格式的文件名:");
            //Console.WriteLine(fullFileName);

            /*
            Console.WriteLine("请输入目录:");
            //string ddir = Console.ReadLine();
            string dirInput = Console.ReadLine();
            Console.WriteLine("该目录下的子目录有:");
            DirectoryInfo dir = new DirectoryInfo(dirInput);
            
            DirectoryInfo[] dirs = dir.GetDirectories();
           
            foreach (DirectoryInfo my in dirs)
            {
                Console.WriteLine(my.FullName);
            }
              */

            Console.WriteLine("请输入类型(如:modis、omi、tmos等并按回车结束(不区分大小写)):");
            string typeInput=Console.ReadLine();
            if (typeInput.ToLower() == "modis")
                goto LabelModis;
            else if (typeInput.ToLower() == "omi")
                goto LabelOmi;
            else if (typeInput.ToLower() == "tmos")
                goto LabelTmos;
            else if (typeInput.ToLower() == "avhrr")
                goto LabelAvhrr;
            #endregion

            #region "已注释:判断文件夹下有无子目录"
            //if (dirs.Length > 0)
            //{
            //        foreach(DirectoryInfo dChild in dir.GetDirectories("*"))
            //        {
            //            //如果用GetDirectories("ab*"),那么全部以ab开头的目录会被显示
            //            //Console.WriteLine(dChild);//打印文件名
            //            Console.WriteLine(dChild.FullName);//打印路径和文件名
            //        }    
            //}
            //else
            //{
            //    //没有子文件夹
            //}
            #endregion

            /***********************************AVHRR***********************************/
        LabelAvhrr:
            {
                #region "LabelAvhrr"

                Console.WriteLine("请输入目录(至底):");
          //  string avhrrPath=@"E:\DATA02\AVHRR\1149891193\001";
            string avhrrPath=Console.ReadLine();
            
            //从字符串路径转化为目录信息
            DirectoryInfo dirAvhrr= new DirectoryInfo(avhrrPath);
            
            Console.WriteLine("目录\"{0}\"下的文件有:",avhrrPath);

            /********fileNum记录了文件的个数********/
            int fileNum = dirAvhrr.GetFiles().Length;

            /********字符串数组fileNames记录了这些文件的文件名********/
            string[] fileNames = new string[fileNum];
            int filenumber = 0;
            foreach (FileInfo dChild in dirAvhrr.GetFiles("*"))
            {
                  //如果用GetFiles("*.txt"),那么全部txt文件会被显示
                  //Console.WriteLine(dChild.Name);  //显示文件名
                  // Console.WriteLine(dChild.FullName);//显示路径和文件名
                  fileNames[filenumber] = dChild.Name;
                  filenumber++;
            }
            
            //测试信息:显示所有文件名
            foreach (string myFileName in fileNames)
            {
                Console.WriteLine(myFileName);
            }

            /**********Split文件名,生成信息项**********/
            //一维数组info1起TEMP作用:存储生成的信息项
            //二维数组info2【文件序号,信息项序号】存储每个文件的每个信息项
            char[] separator = { '.' };
            string[] info1 = new string[10];
            string[,] info2 = new string[fileNum, 10];
            for (int ii = 0; ii < fileNum; ++ii)
            {
                info1 = fileNames[ii].Split(separator);
                {
                    int numOfItem = info1.Length;
                    for (int jj = 0; jj < numOfItem;jj++ )
                    info2[ii, jj] = info1[jj];
                }
            }

            #region "已注释:显示每个文件的信息项,查证是否正确"
            //遍历二维数组  注意:不是数组的数组
            //Console.WriteLine();
            //Console.WriteLine("信息项如下所示:");
            //foreach (string aa in info2)
            //{
            //    Console.Write(aa+" ");
                
            //    if(aa=="WI"||aa=="GC")
            //        Console.WriteLine();
            //}
            #endregion


            /******************Access数据库操作部分******************/
            //建立Access数据库Metadata以及表AVHRR
            ADOX.Catalog catalog = new Catalog();
            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfo.mdb;Jet OLEDB:Engine Type=5");
            ADODB.Connection cn = new ADODB.Connection();
            cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfo.mdb", null, null, -1);
            catalog.ActiveConnection = cn;
            ADOX.Table table = new ADOX.Table();
            table.Name = "AVHRR";

            #region "已注释:键的添加"
            // ADOX.Column column = new ADOX.Column();
           // column.ParentCatalog = catalog;
           // column.Name = "RecordID";
           // column.Type = DataTypeEnum.adInteger;
           // column.DefinedSize = 9;
           //column.Properties["AutoIncrement"].Value = true;
           // table.Columns.Append(column, DataTypeEnum.adInteger, 9);
           // table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);

         //   table.Columns.Append("CustomerName", DataTypeEnum.adVarWChar, 50);
         //   table.Columns.Append("Age", DataTypeEnum.adInteger, 9);
            //  table.Columns.Append("Birthday", DataTypeEnum.adDate, 0);
            #endregion

            table.Columns.Append("Type", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("SubType", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Band", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Date", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("MaxLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MaxLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("Path", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("FileName", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Extension", DataTypeEnum.adVarWChar, 50);
           
            catalog.Tables.Append(table);

            /*************插入数据*************/
           //循环遍历所有文件,将含有的信息项添加进Access数据库中
            for (int ia = 0; ia < fileNum; ++ia)
            { 
                //构造sql语句
                string sql = "insert into AVHRR values ('AVHRR','null','null','null',+90,-90,+180,-180,'"+avhrrPath+"','"+fileNames[ia]+"','" + info2[ia, 7] + "')";
                //string sql = "INSERT INTO AVHRR (Band,[Date],MaxLat,MinLat,MaxLon,MinLon) VALUES  ('info2[0,2]','info2[0,3]','info2[0,4]','info2[0,5]','info2[0,6]','info2[0,7]')";
               string dbpath = "E:\\MetaInfo\\MetaInfo.mdb";   //access数据库的路径

            OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbpath); //定义数据库连接对象
            OleDbCommand cmd = new OleDbCommand(sql, con); //定义Command对象
            con.Open(); //打开数据库连接

             cmd.ExecuteNonQuery(); //执行Command命令
         
            con.Close(); //关闭数据库连接
            }
            cn.Close();
            }
#endregion
           

            /***********************************MODIS***********************************/
        LabelModis:
            {
                #region "LabelModis"

                Console.WriteLine("请输入目录(至底):");
                string inputPath = Console.ReadLine();

                DirectoryInfo dirInput = new DirectoryInfo(inputPath);

                /********fileNum记录了文件的个数********/
                int fileNumOfCompressed = dirInput.GetFiles().Length;

                /********字符串数组fileNamesModis记录了这些文件的文件名********/
                string[] fileNamesOfCompressed = new string[fileNumOfCompressed];
                int fileNumOfCompressed1 = 0;
                foreach (FileInfo dChild in dirInput.GetFiles("*"))
                {
                    //如果用GetFiles("*.txt"),那么全部txt文件会被显示
                    //Console.WriteLine(dChild.Name);  //显示文件名
                    // Console.WriteLine(dChild.FullName);//显示路径和文件名
                    fileNamesOfCompressed[fileNumOfCompressed1] = dChild.Name;
                    fileNumOfCompressed1++;
                }
                //测试信息:显示所有压缩文件名
                Console.WriteLine("所在路径:{0}", inputPath);
                Console.WriteLine("该路径有压缩文件:");
                foreach (string myFileName in fileNamesOfCompressed)
                {
                    Console.WriteLine(myFileName);
                }

                //路径:inputPath,文件名:fileNamesModis[i],  i从0到fileNumberModis-1

                /////////////////////////读取压缩文件
                List<string> fileNames = new List<string>();
                //遍历每个tar.gz压缩文件
                for (int imodisname = 0; imodisname < fileNumOfCompressed1; ++imodisname)
                {
                    //fileNames存储了所有压缩文件里面的文件名
                    fileNames.AddRange(getModTarGzFileNames(fileNamesOfCompressed[imodisname], inputPath));
                }
                Console.WriteLine();
                Console.WriteLine("所有压缩文件里面的文件有:");
                foreach (string myFN in fileNames)
                    Console.WriteLine(myFN);

                //提取MODIS、OMI、TMOS等传感器大类
                //typeName存储了大类的名字
                char[] sep = { '\\' };
                List<string> tabName = new List<string>();
                tabName.AddRange(inputPath.Split(sep));
                string typeName = "";
                for (int itabname = 0; itabname < tabName.Count; ++itabname)
                {
                    if ("MODIS" == tabName[itabname])
                        typeName = "MODIS";
                    else if ("OMI" == tabName[itabname])
                        typeName = "OMI";
                    else if ("TMOS" == tabName[itabname])
                        typeName = "TMOS";
                }
                Console.WriteLine(typeName);

                //第一次分割:按照“.”分割成 fileInfoItem
                //List<string>类型 fileNames存储了所有压缩文件里面的文件名
                List<string> fileInfoItem = new List<string>();
                char[] sepdot = { '.' };
                foreach (string myFN in fileNames)
                {
                    fileInfoItem.AddRange(myFN.Split(sepdot));
                }

                //格式名字:fileInfoItem[fileInfoItem.Count - 1]
                Console.WriteLine(fileInfoItem[fileInfoItem.Count - 1]);

                foreach (string iiiiii in fileInfoItem)
                    Console.WriteLine(iiiiii);

                //判断日平均还是月平均
                string averagemonthorday = "";
                List<string> pathItem = new List<string>();
                pathItem.AddRange(inputPath.Split('\\'));
                for (int idayormonth = 0; idayormonth < pathItem.Count; ++idayormonth)
                {
                    if ("monthly" == pathItem[idayormonth])
                        averagemonthorday = "monthly";
                    else if ("daily" == pathItem[idayormonth])
                        averagemonthorday = "daily";
                }
                Console.WriteLine("月平均还是日平均?");
                Console.WriteLine(averagemonthorday);

                string dateyyyymmdd = DayToDate(fileInfoItem[1]);

                //若fileInfoItem含有“_”则进行二次分割:fileInfoSubItem
                //   fileInfoSubItem

                /******************Access数据库操作部分******************/
                //建立Access数据库Metadata以及表AVHRR
                ADOX.Catalog catalog = new Catalog();
                catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoMODIS.mdb;Jet OLEDB:Engine Type=5");
                ADODB.Connection cn = new ADODB.Connection();
                cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoMODIS.mdb", null, null, -1);
                catalog.ActiveConnection = cn;
                ADOX.Table table = new ADOX.Table();
                table.Name = typeName;

                table.Columns.Append("Type", DataTypeEnum.adVarWChar, 50);
                table.Columns.Append("SubType", DataTypeEnum.adVarWChar, 50);
                table.Columns.Append("Band", DataTypeEnum.adVarWChar, 50);
                table.Columns.Append("Date", DataTypeEnum.adVarWChar, 50);
                table.Columns.Append("MaxLat", DataTypeEnum.adDouble, 50);
                table.Columns.Append("MinLat", DataTypeEnum.adDouble, 50);
                table.Columns.Append("MaxLon", DataTypeEnum.adDouble, 50);
                table.Columns.Append("MinLon", DataTypeEnum.adDouble, 50);
                table.Columns.Append("Path", DataTypeEnum.adVarWChar, 150);
                table.Columns.Append("FileName", DataTypeEnum.adVarWChar, 150);
                table.Columns.Append("Extension", DataTypeEnum.adVarWChar, 50);

                catalog.Tables.Append(table);

                /*************插入数据*************/
                //循环遍历所有文件,将含有的信息项添加进Access数据库中
                for (int ia = 0; ia < fileNames.Count; ++ia)
                {
                    //构造sql语句
                    string sql = "insert into MODIS values ('MODIS','" + averagemonthorday + "','null','" + dateyyyymmdd + "',+90,-90,+180,-180,'" + inputPath + "','" + fileNames[ia] + "','" + fileInfoItem[fileInfoItem.Count - 1] + "')";
                    //string sql = "INSERT INTO AVHRR (Band,[Date],MaxLat,MinLat,MaxLon,MinLon) VALUES  ('info2[0,2]','info2[0,3]','info2[0,4]','info2[0,5]','info2[0,6]','info2[0,7]')";
                    string dbpath = "E:\\MetaInfo\\MetaInfoMODIS.mdb";   //access数据库的路径

                    OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbpath); //定义数据库连接对象
                    OleDbCommand cmd = new OleDbCommand(sql, con); //定义Command对象
                    con.Open(); //打开数据库连接

                    cmd.ExecuteNonQuery(); //执行Command命令

                    con.Close(); //关闭数据库连接
                }
                cn.Close();
                #endregion
            }

    LabelOmi:
        {
            #region "LabelOmi"
            Console.WriteLine("请输入目录(至底):");
            string inputPath = Console.ReadLine();

            DirectoryInfo dirInput = new DirectoryInfo(inputPath);

            /********fileNum记录了文件的个数********/
            int fileNumOfCompressed = dirInput.GetFiles().Length;

            /********字符串数组fileNamesModis记录了这些文件的文件名********/
            string[] fileNamesOfCompressed = new string[fileNumOfCompressed];
            int fileNumOfCompressed1 = 0;
            foreach (FileInfo dChild in dirInput.GetFiles("*"))
            {
                //如果用GetFiles("*.txt"),那么全部txt文件会被显示
                //Console.WriteLine(dChild.Name);  //显示文件名
                // Console.WriteLine(dChild.FullName);//显示路径和文件名
                fileNamesOfCompressed[fileNumOfCompressed1] = dChild.Name;
                fileNumOfCompressed1++;
            }
            //测试信息:显示所有压缩文件名
            Console.WriteLine("所在路径:{0}", inputPath);
            Console.WriteLine("该路径有压缩文件:");
            foreach (string myFileName in fileNamesOfCompressed)
            {
                Console.WriteLine(myFileName);
            }

            //路径:inputPath,文件名:fileNamesModis[i],  i从0到fileNumberModis-1


            /////////////////////////读取压缩文件///////////////////
            List<string> fileNames = new List<string>();
            //遍历每个tar.gz压缩文件
            for (int imodisname = 0; imodisname < fileNumOfCompressed1; ++imodisname)
            {
                //fileNames存储了所有压缩文件里面的文件名
                fileNames.AddRange(getModTarGzFileNames(fileNamesOfCompressed[imodisname], inputPath));
            }
            Console.WriteLine();
            Console.WriteLine("所有压缩文件里面的文件有:");
            int fileNumber = 0;
            foreach (string myFN in fileNames)
            {
                Console.WriteLine(myFN);
                fileNumber++;
            }
            Console.WriteLine("文件个数:{0}", fileNumber);
            //提取MODIS、OMI、TMOS等传感器大类
            //typeName存储了大类的名字
            char[] sep = { '\\' };
            List<string> tabName = new List<string>();
            tabName.AddRange(inputPath.Split(sep));
            string typeName = "";
            for (int itabname = 0; itabname < tabName.Count; ++itabname)
            {
                if ("MODIS" == tabName[itabname])
                    typeName = "MODIS";
                else if ("OMI" == tabName[itabname])
                    typeName = "OMI";
                else if ("TMOS" == tabName[itabname])
                    typeName = "TMOS";
            }
            Console.WriteLine("类型名字:{0}",typeName);

            //第一次分割:按照“.”分割成 fileInfoItem
         //   List<string>类型 fileNames存储了所有压缩文件里面的文件名
            List<string> fileInfoItem = new List<string>();
            char[] sepdot = { '.' };
            foreach (string myFN in fileNames)
            {
                fileInfoItem.AddRange(myFN.Split(sepdot));
            }

            //格式名字:fileInfoItem[fileInfoItem.Count - 1]
            Console.WriteLine("格式名字:{0}", fileInfoItem[fileInfoItem.Count - 1]);
   
            //foreach (string iiiiii in fileInfoItem)
            //    Console.WriteLine(iiiiii);

        //分割压缩文件名,提取年月日信息
            List<string[]> compressedFileInfoItem = new List<string[]>();
            int ix = 0;
            string[,] comFileItemInfoItem = new string[fileNumOfCompressed, 2];

       
            char[] separator = { '_' };
            string[] info1 = new string[2];
            string[] info2 = new string[fileNumOfCompressed];
            for (int ii = 0; ii < fileNumOfCompressed; ++ii)
            {
                info1 = fileNamesOfCompressed[ii].Split(separator);
                {
                    for (int jj = 0; jj < fileNumOfCompressed; jj++)
                        info2[ii] = info1[1];
                }
            }

            //info2[0----fileNumOfCompressed-1]存储了以八位数字开始的字符串
            string[] info3 = new string[3];    
            string[] info4 = new string[fileNumOfCompressed];
            for (int ii = 0; ii < fileNumOfCompressed; ++ii)
            {
                info3 = info2[ii].Split('.');
                {
                    for (int jj = 0; jj < fileNumOfCompressed; jj++)
                        info4[ii] = info3[0];
                }
            }
            //info4[0----fileNumOfCompressed-1]存储了8位数
            //foreach (string mystr in info4)
            //{
            //    Console.WriteLine(mystr);
            //}
        
            string[] dateyyyymmdd = new string[fileNumOfCompressed];
            for (int ixx = 0; ixx < fileNumOfCompressed; ++ixx)
            {
               char[] ch01 = info4[ixx].ToCharArray();
               dateyyyymmdd[ixx] = ch01[0].ToString() + ch01[1].ToString() + ch01[2].ToString() + ch01[3].ToString() + "年";
               dateyyyymmdd[ixx]+= ch01[4].ToString()+ ch01[5].ToString()+"月"+ ch01[6].ToString()+ ch01[7].ToString()+"日";
            }
   

            string[] dateyyyymmdd1 = new string[fileNumber];
            for (int idate = 0,iidate=0; idate < fileNumOfCompressed;++idate )
            {
                iidate = idate;
                dateyyyymmdd1[iidate*2] = dateyyyymmdd[idate];
                dateyyyymmdd1[iidate*2+1] = dateyyyymmdd[idate];
            }
            foreach (string mydate in dateyyyymmdd1)
            {
                Console.WriteLine(mydate);
            }

            //若fileInfoItem含有“_”则进行二次分割:fileInfoSubItem
            //   fileInfoSubItem

            /******************Access数据库操作部分******************/
            //建立Access数据库Metadata以及表AVHRR
            ADOX.Catalog catalog = new Catalog();
            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoOMI.mdb;Jet OLEDB:Engine Type=5");
            ADODB.Connection cn = new ADODB.Connection();
            cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoOMI.mdb", null, null, -1);
            catalog.ActiveConnection = cn;
            ADOX.Table table = new ADOX.Table();
            table.Name = typeName;

            table.Columns.Append("Type", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("SubType", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Band", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Date", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("MaxLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MaxLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("Path", DataTypeEnum.adVarWChar, 150);
            table.Columns.Append("FileName", DataTypeEnum.adVarWChar, 150);
            table.Columns.Append("Extension", DataTypeEnum.adVarWChar, 50);

            catalog.Tables.Append(table);

            /*************插入数据*************/
            //循环遍历所有文件,将含有的信息项添加进Access数据库中
            for (int ia = 0; ia < fileNumber; ++ia)
            {
                //构造sql语句
                string sql = "insert into OMI values ('OMI','null','null','" + dateyyyymmdd1[ia] + "',+90,-90,+180,-180,'" + inputPath + "','" + fileNames[ia] + "','hdf')";
                //string sql = "INSERT INTO AVHRR (Band,[Date],MaxLat,MinLat,MaxLon,MinLon) VALUES  ('info2[0,2]','info2[0,3]','info2[0,4]','info2[0,5]','info2[0,6]','info2[0,7]')";
                string dbpath = "E:\\MetaInfo\\MetaInfoOMI.mdb";   //access数据库的路径

                OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbpath); //定义数据库连接对象
                OleDbCommand cmd = new OleDbCommand(sql, con); //定义Command对象
                con.Open(); //打开数据库连接

                cmd.ExecuteNonQuery(); //执行Command命令

                con.Close(); //关闭数据库连接
            }
            cn.Close();
        }
            #endregion

        LabelTmos:
        {

             Console.WriteLine("请输入目录(至底):");
            string inputPath = Console.ReadLine();

            DirectoryInfo dirInput = new DirectoryInfo(inputPath);

            /********fileNumOfCompressed记录了压缩文件的个数********/
            int fileNumOfCompressed = dirInput.GetFiles().Length;

            /********字符串数组fileNamesOfCompressed记录了这些压缩文件的名称********/
            string[] fileNamesOfCompressed = new string[fileNumOfCompressed];
            int fileNumOfCompressed1 = 0;
            foreach (FileInfo dChild in dirInput.GetFiles("*"))
            {
                //如果用GetFiles("*.txt"),那么全部txt文件会被显示
                //Console.WriteLine(dChild.Name);  //显示文件名
                // Console.WriteLine(dChild.FullName);//显示路径和文件名
                fileNamesOfCompressed[fileNumOfCompressed1] = dChild.Name;
                fileNumOfCompressed1++;
            }
            //测试信息:显示所有压缩文件名
            Console.WriteLine("所在路径:{0}", inputPath);
            Console.WriteLine("该路径有压缩文件:");
            foreach (string myFileName in fileNamesOfCompressed)
            {
                Console.WriteLine(myFileName);
            }

            //路径:inputPath,文件名:fileNamesOfCompressed[i],  i从0到fileNumOfCompressed-1


            /////////////////////////读取压缩文件///////////////////
            List<string> fileNames = new List<string>();
            //遍历每个tar.gz压缩文件
            for (int imodisname = 0; imodisname < fileNumOfCompressed1; ++imodisname)
            {
                //fileNames存储了所有压缩文件里面的文件名
                fileNames.AddRange(getModTarGzFileNames(fileNamesOfCompressed[imodisname], inputPath));
            }
            Console.WriteLine();
            Console.WriteLine("所有压缩文件里面的文件有:");
            int fileNumber = 0;
            foreach (string myFN in fileNames)
            {
                Console.WriteLine(myFN);
                fileNumber++;
            }
            Console.WriteLine("文件个数:{0}", fileNumber);
            //提取MODIS、OMI、TMOS等传感器大类
            //typeName存储了大类的名字
            char[] sep = { '\\' };
            List<string> tabName = new List<string>();
            tabName.AddRange(inputPath.Split(sep));
            string typeName = "";
            for (int itabname = 0; itabname < tabName.Count; ++itabname)
            {
                if ("MODIS" == tabName[itabname])
                    typeName = "MODIS";
                else if ("OMI" == tabName[itabname])
                    typeName = "OMI";
                else if ("TMOS" == tabName[itabname])
                    typeName = "TMOS";
            }
            Console.WriteLine("类型名字:{0}",typeName);

          
            /******************Access数据库操作部分******************/
            //建立Access数据库Metadata以及表AVHRR
            ADOX.Catalog catalog = new Catalog();
            catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoTMOS.mdb;Jet OLEDB:Engine Type=5");
            ADODB.Connection cn = new ADODB.Connection();
            cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\MetaInfo\\MetaInfoTMOS.mdb", null, null, -1);
            catalog.ActiveConnection = cn;
            ADOX.Table table = new ADOX.Table();
            table.Name = typeName;

            table.Columns.Append("Type", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("SubType", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Band", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("Date", DataTypeEnum.adVarWChar, 50);
            table.Columns.Append("MaxLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLat", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MaxLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("MinLon", DataTypeEnum.adDouble, 50);
            table.Columns.Append("Path", DataTypeEnum.adVarWChar, 150);
            table.Columns.Append("FileName", DataTypeEnum.adVarWChar, 150);
            table.Columns.Append("Extension", DataTypeEnum.adVarWChar, 50);

            catalog.Tables.Append(table);

            /*************插入数据*************/
            //循环遍历所有文件,将含有的信息项添加进Access数据库中
            for (int ia = 0; ia < fileNumber; ++ia)
            {
                //构造sql语句
                string sql = "insert into TMOS values ('TMOS','null','null','null',+90,-90,+180,-180,'" + inputPath + "','" + fileNames[ia] + "','hdf')";
                //string sql = "INSERT INTO AVHRR (Band,[Date],MaxLat,MinLat,MaxLon,MinLon) VALUES  ('info2[0,2]','info2[0,3]','info2[0,4]','info2[0,5]','info2[0,6]','info2[0,7]')";
                string dbpath = "E:\\MetaInfo\\MetaInfoTMOS.mdb";   //access数据库的路径

                OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + dbpath); //定义数据库连接对象
                OleDbCommand cmd = new OleDbCommand(sql, con); //定义Command对象
                con.Open(); //打开数据库连接

                cmd.ExecuteNonQuery(); //执行Command命令

                con.Close(); //关闭数据库连接
            }
            cn.Close();
        }
            Console.ReadKey();
        }
    }
}
哈哈,终于完了。。。
越努力,越幸福!
         
2019-01-11 17:17:09 unclebober 阅读数 543

C#获取Xml文件的数据并输出至控制台

Xml文件如下

这是用DataTable.WriteXml方法获取的

<?xml version="1.0" standalone="yes"?>
<Students>
  <Table>
    <Id>150</Id>
    <Name>李四</Name>
    <Sex></Sex>
    <Age>26</Age>
  </Table>
  <Table>
    <Id>154</Id>
    <Name>李四</Name>
    <Sex></Sex>
    <Age>26</Age>
  </Table>
  <Table>
    <Id>164</Id>
    <Name></Name>
    <Sex></Sex>
    <Age>28</Age>
  </Table>
  <Table>
    <Id>165</Id>
    <Name></Name>
    <Sex></Sex>
    <Age>21</Age>
  </Table>
  <Table>
    <Id>168</Id>
    <Name>王超</Name>
    <Sex></Sex>
    <Age>22</Age>
  </Table>
  <Table>
    <Id>169</Id>
    <Name>张三</Name>
    <Sex></Sex>
    <Age>56</Age>
  </Table>
  <Table>
    <Id>170</Id>
    <Name></Name>
    <Sex></Sex>
    <Age>22</Age>
  </Table>
  <Table>
    <Id>171</Id>
    <Name>刘YI</Name>
    <Sex></Sex>
    <Age>28</Age>
  </Table>
  <Table>
    <Id>172</Id>
    <Name>李三四</Name>
    <Sex></Sex>
    <Age>22</Age>
  </Table>
  <Table>
    <Id>173</Id>
    <Name></Name>
    <Sex></Sex>
    <Age>26</Age>
  </Table>
</Students>

程序代码如下

using System;
using System.Collections.Generic;
using System.Data;
using System.Xml;

namespace demo2
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Student> stuList = new List<Student>();
            XmlDocument doc = new XmlDocument();
            doc.Load(@"D:\abk.xml");//加载xml文档
            XmlNode sn = doc.FirstChild;//根节点
            XmlNodeList sList = sn.ChildNodes;//Student节点的集合
            foreach(XmlNode stuNode in sList)
            {
                XmlNodeList filedList = stuNode.ChildNodes;
                Student stu = new Student();
                foreach (XmlNode filedNode in filedList)
                {
                    if (filedNode.Name == "Id")
                        stu.Id = int.Parse(filedNode.InnerText);//节点之间的值强制转换后,赋给stu.Id
                    else if (filedNode.Name == "Name")
                    {
                        stu.Name = filedNode.InnerText;
                    }
                    else if (filedNode.Name == "Sex")
                        stu.Sex = filedNode.InnerText;
                    else
                        stu.Age = int.Parse(filedNode.InnerText);
                }
                stuList.Add(stu);
            }
            foreach(Student item in stuList)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
}

运行之后发现怎么都无法输出Xml文件中的内容

调试发现第一个foreach一直无法执行(直接被跳过)—无法读取Xml文件?

由于要读取根节点,就想着可不能是根节点未被读到

于是删除了Xml文件中的一段<?xml version=“1.0” standalone=“yes”?>

再次运行,正常输出

150李四男26
154李四男26
164王女28
165张女21
168王超男22
169张三男56
170董男22
171刘YI男28
172李三四男22
173李女26

拓展:int.Parse()

作用:数据转换,将数据强制转换为int类型

(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

Convert.ToInt32 与 int.Parse 较为类似,实际上 Convert.ToInt32 内部调用了 int.Parse:

Convert.ToInt32 参数为 null 时,返回 0;
int.Parse 参数为 null 时,抛出异常;

Convert.ToInt32 参数为 “” 时,抛出异常;
int.Parse 参数为 “” 时,抛出异常;

Convert.ToInt32 可以转换的类型较多;
int.Parse 只能转换数字类型的字符串。
int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,如果转换失败,输出值为 0。

2006-09-10 11:48:00 cxbstar 阅读数 1134
请哪位高手指点一下,在vs2005.net中,用C#如何将xml文件转换成二进制数据存入数据库字段,并从数据库提取该字段转换成xml文件?万分感谢 。 
2017-06-01 15:18:08 yanhuatangtang 阅读数 1087

在a.txt  文件中格式为  名字|工资

将 工资提取出来,进行*4操作;再放到文件中。


           string[] strlines = File.ReadAllLines(@"D:\viang\desktop\a.txt", Encoding.Default); //读取文件的每一行        
            for (int i = 0; i < strlines.Length;i++ )
            {
                string []  newstr=strlines[i].Split(new char[]{'|'},StringSplitOptions .RemoveEmptyEntries );
                int sal=2*int.Parse (newstr[1]);//将数字的字符串的形式表示成32位的等效有符号数字
                // int sal = Convert.ToInt32(newstr[1]);
                string ss = (2 * sal).ToString();
                strlines[i] = newstr[0] + ss;
                   
            }
            File.WriteAllLines(@"D:\viang\desktop\a.txt",strlines);  // 处理后再写入文件中

            foreach (var item in strlines)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();



文件中a.txt   处理前


处理后      

 

没有更多推荐了,返回首页