c# – 具有动态列数的平面文件规范化
发布时间:2020-12-15 21:48:56 所属栏目:百科 来源:网络整理
导读:我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于: StatisticID|FileId|Tier0ObjectId|Tier1ObjectId|Tier2ObjectId|Tier3ObjectId|Status1234|7890|abcd|efgh|ijkl|mnop|Pending... 第二
我有一个平面文件,不幸的是动态列结构.值中包含一个值,层次结构中的每个层都有自己的列.例如,我的平面文件可能类似于:
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,并按照描述组织数据?我所做的每一次尝试都让我感到尴尬. 我做过的一些事情: >我试图检查正则表达式模式的列名,识别分层的列,按名称降序排序,然后选择第一条记录……但是我这样丢失了序数列号,所以没有看起来不错. 解决方法
几年前我遇到了一个类似的问题.我使用字典来映射列,它不漂亮,但它工作.
首先制作一个词典: 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; } 我希望这有助于(甚至一点点). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |