Сопоставление пользовательских столбцов электронной таблицы с полями базы данных

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

Я погуглил и нашел только решения .Net, но я ищу решение ColdFusion/Lucee.

У меня есть рабочая форма, позволяющая мне сопоставить пользовательский столбец электронной таблицы со значениями моей базы данных (для этого поста это делается просто; у пользователя нет прямого доступа к базе данных).

Теперь, когда у меня есть данные, я не знаю, как перебрать результаты данных. Я считаю, что будет несколько петель (внешняя и внутренняя). Затем, конечно, мне также нужно перебрать содержимое файла, но я думаю, что если я смогу отобразить заголовки, я смогу выяснить остальное.

Мы будем очень признательны за любые хорошие ссылки, учебные пособия или руководства.

Некоторого псевдокода может быть достаточно, чтобы начать.

User uploads form  
System reads headers and content. 
User is presented form with a list of columns from their uploaded spreadsheet to match with available database fields (eg “column1” matches “customer name”. 
User submits form. 
Now what?

ОБНОВЛЕНО Вот как выглядят данные ПОСЛЕ выполнения сопоставления в моей форме. Разделителем столбцов является :::, а внутри столбца ||| указывает идентификатор, связанный с выбранным значением столбца. Я включил идентификатор и значение столбца, так как планирую снова отобразить сопоставление в качестве подтверждения. Наличие идентификатора избавляет от обращения к базе данных.

дамп отправки формы после выполнения пользователем сопоставления


person HPWD    schedule 12.10.2018    source источник
comment
Когда вы говорите, что теперь? вы спрашиваете, как вставить эти поля в соответствующие столбцы?   -  person Redtopia    schedule 12.10.2018
comment
Как решение .Net сделало это? Можно ли перевести на CFML?   -  person Shawn    schedule 12.10.2018
comment
Я подозреваю, что теперь, что зависит от того, что представляется. Если бы вы включили информацию о том, как вы строите свою форму, это было бы полезно   -  person James A Mohler    schedule 12.10.2018
comment
Вопросы, в которых нас просят порекомендовать или найти книгу, инструмент, программную библиотеку, учебное пособие или другой сторонний ресурс, не относятся к теме Stack Overflow, поскольку они, как правило, привлекают самоуверенные ответы и спам. Вместо этого опишите проблему и то, что было сделано для ее решения.   -  person Miguel-F    schedule 12.10.2018
comment
Я бы предложил начать с очень простой, статической формы. Вы уже знаете, как читать электронную таблицу и получать столбцы. Просто создайте статическую форму со столбцами из электронной таблицы. В каждой строке рядом с ними добавьте раскрывающийся список выбора с доступными именами столбцов базы данных. Как только вы узнаете их выбор, вы просто добавляете данные в таблицу базы данных. Столбцы таблицы будут определены вами, поэтому они могут быть статическими в вашей форме. Или вы можете проявить фантазию и прочитать их динамически. НО, несмотря на все это, кажется очень плохой идеей позволить пользователям решать, куда помещать данные.   -  person Miguel-F    schedule 12.10.2018
comment
Было бы более уместно иметь задание (запланированное задание), которое обрабатывает эти электронные таблицы и переводит информацию в базу данных. Ваш код будет определять, какие столбцы электронной таблицы размещаются в базе данных.   -  person Miguel-F    schedule 12.10.2018
comment
Джеймс относительно «сейчас» отправляется сам файл, который содержит заголовки столбцов и данные внутри курса. Затем я представляю новую строку, добавленную над строкой заголовка Excel. Здесь для каждой ячейки будет раскрывающийся список, в котором пользователь может выбрать из списка доступных полей базы данных (например, имя, адрес и т. д.). После выбора сопоставлений эти значения также будут включены в отправку.   -  person HPWD    schedule 12.10.2018
comment
Что касается подхода .Net, здесь много циклов, но это лучшее, что я могу сказать. Возможно, мне придется потратить больше нескольких минут на изучение их решения, если я хочу воспроизвести его.   -  person HPWD    schedule 12.10.2018
comment
Когда я делал такой импорт в прошлом, я использовал подход, описанный Мигелем-Ф. Представлены столбцы электронной таблицы (источник) и список столбцов базы данных (назначение) рядом с каждым. Пользователь выбрал сопоставления и отправил форму. Страница действий перевела сопоставления (исходные столбцы 3,1,2) => (целевые столбцы 1,2,3) и построила оператор sql. Довольно прямолинейно. Мы решили использовать таблицу сопоставления в базе данных, чтобы избежать раскрытия фактических имен столбцов базы данных, но это можно сделать и со статическими значениями. Какие у вас dbms?   -  person SOS    schedule 12.10.2018
comment
Форма по существу создаст сопоставление. Пользователь не будет иметь прямого доступа к фактическим полям базы данных (я сформулировал это так для краткости). База данных - Мария 10.2.x. Ageax: в прошлом у вас было соотношение 1:1 или были случаи, когда пользовательские данные могли содержать больше столбцов, чем могла принять ваша база данных? Например, у пользователя может быть имя питомца клиента, тогда как мы любим животных, нам не нужно знать имя их питомца, поэтому мы проигнорируем этот столбец. Я упоминаю об этом из-за вашей ссылки 3,1,2 => 1,23.   -  person HPWD    schedule 12.10.2018
comment
Оба. Обычно это было сопоставление 1:1, но для файлов с необязательными/дополнительными столбцами мы просто добавили параметр «Нет» или «Пропустить импорт». Все столбцы с выбранным параметром были проигнорированы.   -  person SOS    schedule 12.10.2018
comment
Отлично, это отличное начало! Спасибо Ageax и Miguel-F за то, что были со мной в этом вопросе. Это должно быть веселым упражнением.   -  person HPWD    schedule 12.10.2018
comment
Еще одна вещь. Я настоятельно рекомендую использовать промежуточные таблицы. Импорт данных электронных таблиц непосредственно в производственные таблицы — это безумие! ;-) Всегда сначала импортируйте во временные/промежуточные таблицы, затем проверяйте, проверяйте, проверяйте...   -  person SOS    schedule 12.10.2018
comment
Здесь есть промежуточные столы. Просто пытаюсь сохранить его основным, чтобы избежать этого шума. :D Спасибо за рекомендацию.   -  person HPWD    schedule 12.10.2018
comment
Попался. Вы просто никогда не знаете... видели, как люди делают какие-то сумасшедшие вещи. Либо вам нужно будет просмотреть содержимое файла, но ... рассматривали ли вы возможность использования этого для создания временного файла с разделителями табуляции, а затем для его массовой загрузки - вместо нескольких вставок?   -  person SOS    schedule 12.10.2018
comment
Нет, но какая очень интересная идея! Будет ли это выглядеть примерно так: 1 прочитать содержимое, 2 получить строку заголовка, 3 запросить электронную таблицу, 4 экспортировать в файл с разделителями табуляции, 5 использовать импорт данных MySQL для чтения данных электронной таблицы. 6 разрешить пользователю отображать заголовки столбцов ?   -  person HPWD    schedule 13.10.2018
comment
Давайте продолжим это обсуждение в чате.   -  person SOS    schedule 13.10.2018


Ответы (1)


Если я правильно понял, ваш вопрос: how do you provide the user a form allowing them to map their spreadsheet columns to that of the database

Поскольку у вас есть имена столбцов их электронной таблицы и у вас есть имена столбцов базы данных, то эта проблема, по сути, является проблемой UI/UX. Вам нужно показать оба списка и разрешить пользователю отображать их. Я могу представить несколько подходов к этому. Моей первой мыслью была бы какая-то операция перетаскивания, например:

Создайте список полей, по одному для каждого поля в таблице базы данных, и включите имя поля в поле (или над ним). Я назову это db field list. Затем создайте еще один список для каждого столбца электронной таблицы, который я назову spreadsheet column list. Пользователь будет перетаскивать элементы из spreadsheet column list в db field list.

Когда сопоставление завершено пользователем, вы должны сохранить имена столбцов/полей в качестве данных для элемента DOM блока db field list. Затем после отправки вы получите данные сопоставления, посетив каждое поле и добавив их в массив. Затем вы сериализуете этот массив в JSON и отправляете его обработчику отправки формы.

Это может быть сложно или просто, в зависимости от ваших знаний о реализации пользовательского интерфейса с использованием JavaScript. jQuery делает это легко (если вы знаете jQuery). Для этого есть даже подключаемый модуль jquery UI: https://jqueryui.com/droppable/.

Быстрый поиск по javascript drag drop может помочь, и вот несколько статей, которые я нашел:

https://www.w3schools.com/html/html5_draganddrop.asp

https://medium.com/quick-code/simple-javascript-drag-drop-d044d8c5bed5

Вам также нужно будет отправить массив сопоставлений с помощью javascript. Вы также можете поискать это, и вот статья, которую я нашел:

https://codereview.stackexchange.com/questions/94493/submit-an-array-as-an-html-form-value-using-javascript

person Redtopia    schedule 12.10.2018
comment
Я не думал о перетаскивании здесь, но использовал его раньше в прошлом. Интересно. Мне нужно посмотреть, подходит ли он для мобильных устройств (особенно для планшетов). Спасибо за ссылку на СЕ. При первоначальном просмотре это выглядит как хорошее чтение и представляет собой другой способ отправки данных, который я не рассматривал. - person HPWD; 12.10.2018
comment
Хотя это идеальный ответ UX, мне нужно больше обрабатывать ответ на представленные данные (что теперь). Я искренне ценю, что вы нашли время, чтобы сформулировать свой ответ. Я прошу прощения за путаницу, когда я написал свой первоначальный вопрос. До сих пор я не понимал, что мне нужно сделать это более точным. Я внес некоторую ясность. - person HPWD; 12.10.2018
comment
@HPWD, вы говорите, что вам нужно знать, как обрабатывать загруженную электронную таблицу и вставлять в сопоставленные поля? - person Redtopia; 12.10.2018
comment
Нет, я записал эту часть. У меня даже есть созданная форма, позволяющая пользователю выбирать, какие формы электронных таблиц сопоставляются с каким полем базы данных. Когда пользователь отправляет эту форму, мне нужно перебрать отправленные данные и сослаться на данные электронной таблицы на те, которые они выбрали из раскрывающегося списка. Я подозреваю, что будет много циклов и много listGetAt(). - person HPWD; 12.10.2018
comment
Я обновил вопрос, чтобы он был более точным и конкретным в отношении того, с чем мне нужна помощь. - person HPWD; 12.10.2018
comment
@HPWD, я предполагаю, что вы загрузили файл во временный каталог или куда-то, где вы можете получить к нему доступ. Это правильно? В этом случае вы ищете какой-то псевдокод для перебора строк в файле CSV и вставки в базу данных? - person Redtopia; 13.10.2018
comment
@HPWD - также я не понимаю, как столбец может иметь идентификатор, поскольку обычно идентификатор ссылается на строку. Если идентификаторы назначаются столбцам, вам, вероятно, нужно отредактировать свой вопрос, чтобы включить вашу схему. - person Redtopia; 13.10.2018