Spring пакет для загрузки файла CSV и вставки в базу данных - PullRequest
0 голосов
/ 01 сентября 2018

В моем проекте есть это требование, когда пользователь загружает CSV-файл, который необходимо отправить в базу данных сервера sql. Я знаю, что мы можем использовать Spring Batch для обработки большого количества записей. Но я не могу найти учебник / пример кода для этого моего требования. Все учебники, с которыми я столкнулся, просто жестко закодировали имя файла CSV и базы данных в памяти, как показано ниже:

https://spring.io/guides/gs/batch-processing/

Файл пользовательского ввода доступен в папке общего диска в назначенное время с префиксом имени файла, например: stack_overlfow_dd-MM-гггг ЧЧ: мм, на ежедневной основе, как я могу опрашивать сетевой диск общего пользования по крайней мере каждые 5-10 минут для один час в день, если его совпадения с регулярным выражением, а затем загрузить в базу данных. Как я могу взять файл CSV сначала из общего хранилища и сохранить его в памяти или где-то еще, а затем настроить Spring Batch для чтения этого в качестве ввода. любая помощь здесь будет оценена. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 01 сентября 2018

Вы можете создать сервисный слой, который может обрабатывать файл Excel, читать данные из файла и создавать объект Java для сохранения в БД. Здесь я использовал apache POI для анализа данных Excel и чтения из таблицы Excel.

public class FileUploadService {

 @Autowired
 FileUploadDao fileUploadDao;

 public String uploadFileData(String inputFilePath) {
  Workbook workbook = null;
  Sheet sheet = null;
  try {

   workbook = getWorkBook(new File(inputFilePath));
   sheet = workbook.getSheetAt(0);

   /*Build the header portion of the Output File*/
   String headerDetails = "EmployeeId,EmployeeName,Address,Country";
   String headerNames[] = headerDetails.split(",");

   /*Read and process each Row*/
   ArrayList < ExcelTemplateVO > employeeList = new ArrayList < > ();
   Iterator < Row > rowIterator = sheet.iterator();

   while (rowIterator.hasNext()) {
    Row row = rowIterator.next();
    //Read and process each column in row
    ExcelTemplateVO excelTemplateVO = new ExcelTemplateVO();
    int count = 0;
    while (count < headerNames.length) {
     String methodName = "set" + headerNames[count];
     String inputCellValue = getCellValueBasedOnCellType(row, count++);
     setValueIntoObject(excelTemplateVO, ExcelTemplateVO.class, methodName, "java.lang.String", inputCellValue);
    }

    employeeList.add(excelTemplateVO);
   }
   fileUploadDao.saveFileDataInDB(employeeList);

  } catch (Exception ex) {
   ex.printStackTrace();
  }


  return "Success";
 }
0 голосов
/ 03 сентября 2018

Все учебники, с которыми я столкнулся, просто жестко запрограммировали имя файла CSV и базы данных в памяти

Вы можете найти образцы в официальном репо здесь . Вот пример , где имя входного файла не жестко закодировано, а передано в качестве параметра задания.

Как я могу сначала взять csv-файл из общего хранилища и сохранить его в памяти или где-то еще, а затем сконфигурировать Spring Batch для чтения его как ввода.

Вы можете выполнить два действия: загрузить файл локально, затем прочитать / обработать / записать его в базу данных (см. https://stackoverflow.com/a/52110781/5019386).

как я могу опрашивать сетевой диск каждые 5-10 минут, по крайней мере, один час в день, если его совпадения с регулярным выражением затем загружаются в базу данных.

После того, как вы определили свою работу, вы можете запланировать ее выполнение, когда хотите использовать:

  • планировщик типа Кварц
  • или с помощью функции планирования задач Spring .
  • или с использованием комбинации Spring Integration и Spring Batch. Интеграция Spring опрашивает каталог, а затем запускает задание Spring Batch, когда это необходимо. Этот подход описан здесь .

Подробнее о планировании работы здесь .

0 голосов
/ 01 сентября 2018

Я считаю, что на ваш вопрос уже дан ответ здесь .

Автор вопроса даже загрузил репозиторий своего рабочего результата: https://github.com/PriyankaBolisetty/SpringBatchUploadCSVFileToDatabase/tree/master/src/main/java/springbatch_example

Вы можете извлекать и фильтровать списки файлов на общем диске с помощью метода API JCIFS SmbFile.listFiles (подстановочный знак строки) .

...