/// <summary> /// Чтение файла. Преобразование данных к многомерному виду. Загрузка данных в ХД. /// </summary> public static void ReadFile() { string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + file + "; Extended Properties=Excel 12.0 xml"; OleDbConnection connection = new OleDbConnection(connectionString); OleDbCommand cmd = connection.CreateCommand(); cmd.CommandText = "select * from [Лист1$]"; connection.Open(); OleDbDataReader dr = cmd.ExecuteReader(); DataTable t = new DataTable(); t.Load(dr); Dictionary <int, object> years = new Dictionary <int, object>(); Dictionary <int, object> age = new Dictionary <int, object>(); Dictionary <int, object> place = new Dictionary <int, object>(); //заполняем измерения int i, j; //годы i = 2; for (j = 1; j < t.Columns.Count; j++) { years.Add(j - 1, t.Rows[i].Field <object>(j)); } //возрастные группы j = 0; for (i = 5; ; i++) { if (t.Rows[i].Field <object>(j).ToString().StartsWith("Из")) { break; } age.Add(i - 5, "'" + t.Rows[i].Field <object>(j).ToString() + "'"); } //заполняем местность place.Add(0, "'Городское население'"); place.Add(1, "'Сельское население'"); //ищем городское население int startI = 0; while (true) { if (t.Rows[startI].Field <object>(0) != null) { if (t.Rows[startI].Field <object>(0).ToString().StartsWith("Городское население")) { break; } } startI++; if (startI > 10000) { throw new Exception("Городское население не найдено!"); } } startI += 2;//пропускаем строку //читаем городское население //вывод на консоль //for (i = 0; i < age.Count; i++) //{ // for (j = 0; j < years.Count; j++) // { // Console.Write("{0} ", t.Rows[startI + i].Field<object>(j + 1)); // } // Console.WriteLine(); //} repository.AddFactory(new CubeFactory(repository)); repository.AddFactory(new DimensionFactory(repository)); Cube cube = repository.CreateOrLoadMetaObject(MetaObjectType.Cube, "Куб.Население") as Cube; cube.CubeName = "Население"; Dimension dimYears = repository.CreateOrLoadMetaObject(MetaObjectType.Dimension, "Изм.Годы") as Dimension; dimYears.Name = "Годы"; dimYears.Table = "Годы"; repository.Save(dimYears); Dimension dimAge = repository.CreateOrLoadMetaObject(MetaObjectType.Dimension, "Изм.ВозрастГр") as Dimension; dimAge.Name = "Возраст"; dimAge.Table = "Возраст"; repository.Save(dimAge); Dimension dimPlace = repository.CreateOrLoadMetaObject(MetaObjectType.Dimension, "Изм.Место") as Dimension; dimPlace.Name = "Место"; dimPlace.Table = "Место"; repository.Save(dimPlace); if (cube.DimensionsCount() == 0) { cube.AddDimension(dimYears); cube.AddDimension(dimAge); cube.AddDimension(dimPlace); } repository.Save(cube); //заполняем измерения try { dimYears.DropTable(); } catch { } bool res = dimYears.CreateTable(); dimYears.Insert(years); try { dimAge.DropTable(); } catch { } res = dimAge.CreateTable(); dimAge.Insert(age); try { dimPlace.DropTable(); } catch { } res = dimPlace.CreateTable(); dimPlace.Insert(place); //заполнение таблицы фактов List <Dictionary <string, object> > list = new List <Dictionary <string, object> >(); List <string> fieldList = cube.GetFactTableListFields(); for (i = 0; i < age.Count; i++) { for (j = 0; j < years.Count; j++) { //Console.WriteLine("Координаты: {0} {1} {2} : {3}", years[j], age[i], place[0], t.Rows[startI + i].Field<object>(j + 1)); Console.WriteLine("Координаты: {0} {1} {2} : {3}", j, i, 0, t.Rows[startI + i].Field <object>(j + 1)); Dictionary <string, object> row = new Dictionary <string, object>(); row.Add(fieldList[0], j); row.Add(fieldList[1], i); row.Add(fieldList[2], 0); row.Add("value", t.Rows[startI + i].Field <object>(j + 1)); list.Add(row); } } //сельское население while (true) { if (t.Rows[startI].Field <object>(0) != null) { if (t.Rows[startI].Field <object>(0).ToString().StartsWith("Сельское население")) { break; } } startI++; if (startI > 10000) { throw new Exception("Сельское население не найдено!"); } } startI += 2;//пропускаем строку //читаем сельское население //вывод на консоль //for (i = 0; i < age.Count; i++) //{ // for (j = 0; j < years.Count; j++) // { // Console.Write("{0} ", t.Rows[startI + i].Field<object>(j + 1)); // } // Console.WriteLine(); //} for (i = 0; i < age.Count; i++) { for (j = 0; j < years.Count; j++) { //Console.WriteLine("Координаты: {0} {1} {2} : {3}", years[j], age[i], place[1], t.Rows[startI + i].Field<object>(j + 1)); Console.WriteLine("Координаты: {0} {1} {2} : {3}", j, i, 1, t.Rows[startI + i].Field <object>(j + 1)); Dictionary <string, object> row = new Dictionary <string, object>(); row.Add(fieldList[0], j); row.Add(fieldList[1], i); row.Add(fieldList[2], 1); row.Add("value", t.Rows[startI + i].Field <object>(j + 1)); list.Add(row); } } try { cube.DropTable(); } catch { } res = cube.CreateFactsTable(); cube.Insert(list); //for (i = 0; i < t.Rows.Count;i++ ) //{ // for (j = 0; j < t.Columns.Count; j++) // { // Console.Write("{0} ", t.Rows[i].Field<object>(j)); // } // Console.WriteLine(); //} //int j = 0; //while (dr.Read()) //{ // j++; // Console.Write("{0} строка:", j); // for (int i = 0; i < dr.FieldCount; i++) // Console.Write(dr[i] + " "); // Console.WriteLine(); //} connection.Close(); }