我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于:
StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status 1234|7890|abcd|efgh|ijkl|mnop|Pending ...
第二天相同的饲料可能类似于:
StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Status 1234|7890|abcd|efgh|ijkl|Complete ...
问题是,我并不关心所有层级;我只关心最后(底部)层的id,以及不属于层列的所有其他行数据.我需要将Feed标准化为类似于此的东西以注入关系数据库:
StatisticID|FileId|ObjectId|Status 1234|7890|ijkl|Complete ...
什么是一种有效的,易于阅读的机制,用于确定最后一层的对象id,并按照描述组织数据?我所做的每一次尝试都让我感到尴尬.
我做过的一些事情:
>我试图检查正则表达式模式的列名,识别分层的列,按名称降序排序,然后选择第一条记录……但是我这样丢失了序数列号,所以没有看起来不错.
>我已将我想要的列放入IDictionary< string,int>要引用的对象,但是再次可靠地收集动态列的序数是一个问题,而且这似乎是非常不具有效果的.
解决方法
几年前我遇到了一个类似的问题.我使用字典来映射列,它不漂亮,但它工作.
首先制作一个词典:
private Dictionary<int,int> GetColumnDictionary(string headerLine) { Dictionary<int,int> columnDictionary = new Dictionary<int,int>(); List<string> columnNames = headerLine.Split('|').ToList(); string maxTierObjectColumnName = GetMaxTierObjectColumnName(columnNames); for (int index = 0; index < columnNames.Count; index++) { if (columnNames[index] == "StatisticID") { columnDictionary.Add(0,index); } if (columnNames[index] == "FileId") { columnDictionary.Add(1,index); } if (columnNames[index] == maxTierObjectColumnName) { columnDictionary.Add(2,index); } if (columnNames[index] == "Status") { columnDictionary.Add(3,index); } } return columnDictionary; } private string GetMaxTierObjectColumnName(List<string> columnNames) { // Edit this function if Tier ObjectId is greater then 9 var maxTierObjectColumnName = columnNames.Where(c => c.Contains("Tier") && c.Contains("Object")).OrderBy(c => c).Last(); return maxTierObjectColumnName; }
之后它只是通过文件运行:
private List<DataObject> ParseFile(string fileName) { StreamReader streamReader = new StreamReader(fileName); string headerLine = streamReader.ReadLine(); Dictionary<int,int> columnDictionary = this.GetColumnDictionary(headerLine); string line; List<DataObject> dataObjects = new List<DataObject>(); while ((line = streamReader.ReadLine()) != null) { var lineValues = line.Split('|'); string statId = lineValues[columnDictionary[0]]; dataObjects.Add( new DataObject() { StatisticId = lineValues[columnDictionary[0]],FileId = lineValues[columnDictionary[1]],ObjectId = lineValues[columnDictionary[2]],Status = lineValues[columnDictionary[3]] } ); } return dataObjects; }
我希望这有助于(甚至一点点).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。