I ran into a modeling problem a few years ago. I used the dictionary to match columns, it was ugly, but it worked.
First create a dictionary:
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; }
And after that, it just runs through the file:
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; }
Hope this helps (at least a little).
source share