Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Транспонирование таблицы

Ответить
Настройки темы
C/C++ - [решено] Транспонирование таблицы

Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: xlsx DataTable.xlsx
(10.4 Kb, 4 просмотров)
Добрый день. Прошу помощи знатоков.
Необходимо транспонировать таблицу из строки в столбик при чем необходимо отбросить часть ненужных данных.

пример таблицы со входящими данными

входящие данные в файле DataTable.xlsx
На листе Input - входящие данные
На листе output - то что надо получить


я пытался сделать путем перебора столбцов, но почемуто работает не корректно, да и выглядит это крайне не красиво.
Подскажите может есть варианты более изящьные.

Скрытый текст
Код: Выделить весь код
private DataTable GetTerminalDataTable(DataSet TerminalData)
        {
            DataSet ds = TerminalData;

            #region Обработка DataSet
            // Создаем новую таблицу
            DataTable TabPivot = new DataTable();
            TabPivot.Columns.Add("YCOOR", typeof(int));
            TabPivot.Columns.Add("PRINTMODE", typeof(string));
            TabPivot.Columns.Add("TEXT", typeof(string));
            string Text = "";
            string Printmode = "";
            int Y = 0;

            // Начинаем перебирать таблицы
            for (int tab = 0; tab < ds.Tables.Count; tab++)
            {
                if (ds.Tables[tab].Columns.Count > 1)
                {

                    //AddButton("Нет активных заданий на перемещение", 0, 6);
                    //MessageBox.Show($"Данных больше 1");

                    //Начинаем перебирать данные в этой таблице
                    for (int column = 0; column < ds.Tables[tab].Columns.Count; column++)
                    {
                        DataRow DRow = ds.Tables[tab].Rows[0];

                        int count = 0; //счетчик для подсчета и нумерации строк (ROW)

                        if (SqlExtensions.RemoveIntegers(SqlExtensions.GetColumnName(DRow, column)) == "YCOOR")
                        {
                            Y = SqlExtensions.ConvertStringToInt(SqlExtensions.GetColumnValue(DRow, column));
                        }

                        if (SqlExtensions.RemoveIntegers(SqlExtensions.GetColumnName(DRow, column)) == "PRINTMODE" && SqlExtensions.GetColumnValue(DRow, column) != "CLEAR" && SqlExtensions.GetColumnValue(DRow, column) != "CLSCR" && SqlExtensions.GetColumnValue(DRow, column) != "CENTERED")
                        {
                            Printmode = SqlExtensions.GetColumnValue(DRow, column);
                        }

                        if (SqlExtensions.RemoveIntegers(SqlExtensions.GetColumnName(DRow, column)) == "TEXT")
                        {
                            Text = SqlExtensions.GetColumnValue(DRow, column);
                        }

                        if (!string.IsNullOrEmpty(Text) && !(string.IsNullOrEmpty(Printmode)) && Y >= 0)
                        {
                            var r = TabPivot.NewRow();
                            r["YCOOR"] = Y;
                            r["PRINTMODE"] = Printmode;
                            r["TEXT"] = Text;
                            TabPivot.Rows.Add(r);  //добавляет запись в конец таблицы
                            count++;
                        }

                    }

                }

            }
            #endregion
            return TabPivot;
        }

Отправлено: 08:46, 19-02-2019

 

Ветеран


Contributor


Сообщения: 25412
Благодарности: 7381

Профиль | Отправить PM | Цитировать


dosperados, я лично не вижу там транспонирования.
Транспонирование выглядит вот так…

Опишите словами принципы перевода содержимого одного Рабочего листа в содержимое другого Рабочего листа.

Отправлено: 19:48, 19-02-2019 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для dosperados

Пользователь


Сообщения: 77
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Вы правы в чистом виде там нет транспонирования.
Наверно правильнее было бы назвать просто "преобразование таблицы".

Суть преобразования состоит в том, что в одной строке приходят все данные.
Скрытый текст
XCOOR | YCOOR | PRINTMODE | PRINTMODE | PRINTMODE | TEXT | METHOD | PRINTMODE | XCOOR | YCOOR | PRINTMODE | PRINTMODE | TEXT.......
0 | 0 | CLEAR | CLSCR | INVERSE | ВХОД В СИСТЕМУ | PRINT | CLEAR | 0 | 2 | NORMAL | CENTERED | System.......



Отбрасывая лишние данные нужно преобразовать их в вид:
Причем есть такие столбец "PRINTMODE" который содержит данные в виде триггера (т.е. пока не придет команда CLEAR в этом столбце, что значит очистить значение и следующая команда INVERSE или NORMAL)
Скрытый текст
YCOOR | PRINTMOD | TEXT
0 | INVERSE | ВХОД В СИСТЕМУ
1 | NORMAL | System
4 | NORMAL | УКАЗАНИЕ ОПЕРАТОРУ
6 | NORMAL | СКАНИРУЙТЕ ЛИЧНУЮ
7 | NORMAL | КАРТОЧКУ ДЛЯ
8 | NORMAL | НАЧАЛА РАБОТЫ
10 | INVERSE | DB_Name
13 | INVERSE | АДРЕС:TEST_MSSQL-F38E7C3C
14 | INVERSE | X - ВЫХОД


Для меня большую трудность представляет именно этот столбец PRINTMOD, который содержится не всегда, но необходим для выходной таблицы.

Отправлено: 05:42, 20-02-2019 | #3


Ветеран


Contributor


Сообщения: 25412
Благодарности: 7381

Профиль | Отправить PM | Цитировать


dosperados, опишите алгоритм преобразований словами.

Отправлено: 05:58, 20-02-2019 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Транспонирование таблицы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
MSFT SQL Server - [решено] Некоторые поля одной таблицы синкать с полями другой таблицы uptk Программирование и базы данных 5 01-09-2014 20:29
Удаление записей таблицы по данным другой таблицы xNiSSaNx Вебмастеру 4 02-08-2013 21:58
MSFT SQL Server - создание таблицы точнее проблемма с созданием таблицы GAROD Программирование и базы данных 4 02-12-2010 00:58
Win32 API - Таблицы в visual c chilka Программирование и базы данных 2 15-05-2008 22:39
Таблицы swine Вебмастеру 11 08-05-2004 18:25




 
Переход