Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Транспонирование таблицы (http://forum.oszone.net/showthread.php?t=339300)

dosperados 19-02-2019 08:46 2858712

Транспонирование таблицы
 
Вложений: 1
Добрый день. Прошу помощи знатоков.
Необходимо транспонировать таблицу из строки в столбик при чем необходимо отбросить часть ненужных данных.

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

входящие данные в файле 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;
        }


Iska 19-02-2019 19:48 2858832

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

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

dosperados 20-02-2019 05:42 2858941

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, который содержится не всегда, но необходим для выходной таблицы.

Iska 20-02-2019 05:58 2858942

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


Время: 09:52.

Время: 09:52.
© OSzone.net 2001-