Войти

Показать полную графическую версию : [решено] Транспонирование таблицы


dosperados
19-02-2019, 08:46
Добрый день. Прошу помощи знатоков.
Необходимо транспонировать таблицу из строки в столбик при чем необходимо отбросить часть ненужных данных.


входящие данные в файле 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
dosperados, я лично не вижу там транспонирования.
https://i.imgur.com/4ab0jT4.png
Опишите словами принципы перевода содержимого одного Рабочего листа в содержимое другого Рабочего листа.

dosperados
20-02-2019, 05:42
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
dosperados, опишите алгоритм преобразований словами.




© OSzone.net 2001-2012