using ExcelDataReader; using System; using System.Collections.Generic; using System.Data; using System.IO; namespace etoy { class CmdReadMetadataTable : Command { const string SEARCH_PATTERN = "*.metadata"; ExcelReaderConfiguration _excelReaderConfiguration; MetadataTableCsvParser _parser = new MetadataTableCsvParser(); public override string Description => "读取Metadata表"; protected override void OnProcess() { SetProgress(0.1f); _excelReaderConfiguration = new ExcelReaderConfiguration() { AutodetectSeparators = new char[] { ',' } }; var metedatas = Directory.GetFiles(Context.Option.CsvOutput, SEARCH_PATTERN, SearchOption.TopDirectoryOnly); if(metedatas.Length > 0) { List metadatas = new List(); SetProgress(0.4f); foreach (var metedata in metedatas) ReadSingle(metedata.ToPath(), metadatas); SetProgress(0.8f); Context.Blackboard.MetadataTables = metadatas; Completed(); } else { SetException(new Exception("找不到Metadata表")); } } void ReadSingle(string file, List metadatas) { using Stream metadata = new FileStream(file, FileMode.Open, FileAccess.Read); IExcelDataReader reader = ExcelReaderFactory.CreateCsvReader(metadata, _excelReaderConfiguration); DataSet dataSet = reader.AsDataSet(); if (dataSet.Tables.Count != 1) throw new Exception($"Metadata表 Table数量不为1, {file}"); DataTable dt = dataSet.Tables[0]; if (dt == null) throw new Exception($"Metadata表 DataTable等于空, {file}"); MetadataTable table = _parser.Parser(dt, file); metadatas.Add(table); metadata.Close(); reader.Close(); reader.Dispose(); } } }