Несмотря на отношение к здравоохранению, я использую Mirth Connect (теперь называемый NextGen Connect Integration Engine ) для такого рода вещей, независимо от отрасли. Открытый исходный код , довольно легкий и бесконечно настраиваемый, он может извлекать CSV и другие текстовые, XML и EDI-документы из различных источников, преобразовывать их, а затем отправлять на SQL Server. Использование Interface Engine, такого как Mirth Connect, обеспечивает мониторинг и инструментальную панель со встроенными журналами ошибок, архивированием и другими преимуществами.
То же самоетакже легко достигается, если вы хотите пойти в другом направлении. Например, у вас может быть запрос, который отправляет результаты обратно на SFTP-сервер.
Для описанного вами варианта использования (CSV to SQL) решение может выглядеть следующим образом:
- Создайте новый канал в Mirth
- . На вкладке «Сводка» установите для параметра «Тип данных» значение «Текст с разделителями» в исходном соединителе и XML для всех остальных соединителей. (XML является «родным» форматом Mirth - вы фактически не будете работать с XML напрямую)
- Во входных свойствах «Текст с разделителями» установите разделитель столбцов на «,» и установите «Имена столбцов»в "STUDENT_KEY, FIRST_NAME, LAST_NAME, COURSE_NAME, COURSE_NUMBER, SCORE, SCORE_DATE, TRAINING_HOURS" или любых других столбцах в CSV-файле.
На вкладке «Источник» установите тип соединителя «File Reader» и добавьте информацию о сервере FTP. Ключевыми параметрами могут быть «Метод» из «FTP» или «SFTP», в зависимости от сервера и пути, фильтра имени файла, имени пользователя и пароля. Решите, как обрабатывать «Завершенные» файлы - вы можете удалить их илипереместите их с помощью «действия после обработки». Если оставить значение «Нет», то все сообщения будут обработаны неопределенно долго. Я рекомендую включить «Проверка возраста файла», чтобы избежать чтения файлов во время их записи. 60 секунд обычно достаточно для всех, кроме самых крупных или самых медленных авторов. Установите кодировку файлов для чтения, обычно utf8 (что, я считаю, по умолчанию)
На вкладке назначения выберите Тип коннектора «Javascript Writer» Напишите свой сценарий, вызывая SQL Server при необходимости:
Пример Javascript с E4X:
var dbConn;
var result;
try {
dbConn = DatabaseConnectionFactory.createDatabaseConnection('net.sourceforge.jtds.jdbc.Driver','jdbc:jtds:sqlserver://127.0.0.1:1433/DBName','username','password');
// insert header
var params = new java.util.ArrayList();
params.add($('originalFilename'));
result = dbConn.executeUpdateAndGetGeneratedKeys('INSERT INTO ImportFiles ([Filename], ImportDate) VALUES (?, GETDATE());', params);
result.next();
var headerId = result.getInt(1);
// save in the channel map (message data) for fun
channelMap.put('headerId', headerId);
// loop over rows and insert
var msg = new XML(connectorMessage.getEncodedData());
for each (row in msg.row) {
if (row.Location.toString() == "Current Location") {
// skip headers
continue;
}
params = new java.util.ArrayList();
params.add(headerId);
params.add(row.SpillmanPatientID.toString());
params.add(row.AdmitDate.toString());
params.add(row.Location.toString());
params.add(row.TransferDate.toString());
params.add(row.LastName.toString());
params.add(row.FirstName.toString());
params.add(row.MiddleName.toString());
params.add(row.SuffixName.toString());
params.add(row.Birthdate.toString());
params.add(row.Sex.toString());
params.add(row.SSN.toString());
dbConn.executeUpdate('INSERT INTO dbo.ImportData (ImportFileID, SpillmanPatientID, AdmitDate, Location, TransferDate, LastName, FirstName, MiddleName, SuffixName, Birthdate, Sex, SSN)'
+ ' SELECT ?, ?, ?, GETDATE(), ?, ?, ?, ?, ?, ?, ?, ?, ?', params);
}
// call sproc
params = new java.util.ArrayList();
params.add(headerId);
dbConn.executeUpdate('EXEC dbo.ProcessImportFile ?', params);
} finally {
if (dbConn) {
dbConn.close();
}
}
Обратите внимание, что элементы "строки" - это то, что вы указали для имен столбцов в настройке соединителя источника.
Нажмите «Развернуть канал» слева Проверьте работу с помощью панели мониторинга. Вы можете дважды щелкнуть канал, чтобы просмотреть отправленные сообщения (с результатами и журналами ошибок), а также щелкнуть правой кнопкой мыши и нажать «Переслать сообщение», чтобы повторить попытку (например, если вы внесете изменения в сценарий).
После того, как все настроено так, как вы хотите, я бы порекомендовал:
- На вкладке сводки в настройке канала
- Установить "Хранение сообщений"на «Производство» или «Необработанный» - вы всегда можете вернуться к разработке и повторно обработать сообщение, если у вас есть проблема
- Установите для параметра «Удаление метаданных» значение (например) 7 дней
- Установить«Пользовательские метаданные» - удалите SOURCE и TYPE, добавьте originalFilename и любые данные, которые вы добавили на карту каналов в вашем JavaScript. В приведенном выше примере я создаю «headerId», который можно использовать для корреляции между SQL и Mirth.