следует добавить дату для каждой строки в БД при загрузке CSV-файла с использованием Java - PullRequest
0 голосов
/ 24 октября 2018

У меня есть CSV-файл, который имеет почти 10 тыс. Записей и в котором нет поля, подобного дате, но когда я сохраняю CSV-файл в БД, эта созданная дата должна быть вставлена ​​в ту же таблицу. Код, который я написал, показан ниже.

public void insertData(final InputStream inputStream, final String originalFilename, final User user)
        throws ServiceException {
    LOGGER.entry("FileName", originalFilename, "LoggedinUser", user.getName());
    final File file = new File(originalFilename);
    if (originalFilename.endsWith(.csv)) //to check csv notation {
        try {
            final BufferedReader bufReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
            final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8"));
            int rowcount = 0;
            String line = "";
            while ((line = bufReader.readLine()) != null) {
                if (rowcount == 0) {
                    rowcount++;
                    continue;
                }
                writer.write(line);
                writer.newLine();
                rowcount++;
            }
            bufReader.close();
            writer.close();
            try {
                DataDAO.insertDataFromCSV(file, "Data"); //method to insert into DB
            } catch (DAOException dexc) {
                final String errorMsg = "Exception while processing DAO call to save imported CSV File";
                LOGGER.error(errorMsg, dexc);
                throw new ServiceException(errorMsg, dexc);
            }

        } catch (IOException ioe) {
            final String errorMsg = "Exception while reading from the file or writing to the file";
            LOGGER.error(errorMsg, ioe);
        }
    }
}



 DataDao.insertDataFromCsv

public void insertEnrichmentDataFromCSV(final File file, final String type) 
throws DAOException {
LOGGER.entry();
try {
LOGGER.info("Batch insertion of " + type + "  into database from 
file : " + file.getAbsolutePath());
final StringBuffer loadQuery = new StringBuffer(DAOConstants.QUERY_START + 
file.getPath());
if ("Data".equalsIgnoreCase(type)) {
loadQuery.append(DAOConstants.DATA_QUERY_START + 
DAOConstants.DATA_QUERY);
}

this.getNamedParameterJdbcTemplate().getJdbcOperations().
execute(loadQuery.toString());
LOGGER.info("Successfully inserted " + enrichmentType + " in to DB ");
} catch (DataAccessException exception) {
final String errorMessage = "Exception while performing batch insertion of " 
+ enrichmentType + " into database";
LOGGER.error(errorMessage, exception);
throw new DAOException(errorMessage, exception);
}
LOGGER.exit();

}


DAOConstants.Java

public final class DAOConstants {
public static final String QUERY_START = "LOAD DATA LOCAL INFILE '";
public static final String PUPPET_QUERY = " LINES TERMINATED BY '\n' (pe_group,data_master,pe_environment,cert_name,host_name,serial_number,iptables_status,kernel,product_name,project,department,cluster_name,architecture,citrix_version,dcenv,iis_version,is_virtual,operating_system,operating_system_maj_release,physical_processor_count,processor_count,postgres_default_version,role,sql_version,websphere_profiles,websphere_version,was,dotnet_latest_version,firefox_version,httpd_status,oracle,sybase,mq,mysql,mysql_version,jboss_version,java_version,data_master_url,httpd_process,apache_version,created_by)";
public static final String PUPPET_QUERY_START = "' INTO TABLE puppet_data 
FIELDS TERMINATED BY ','";
private DAOConstants() {
}
}

Это мой код для хранения CSV-файла в БД. Может, кто-нибудь подскажет, как добавить insertdate в каждую строку таблицы Ex: мои данные CSV - это a, b, c, но когда я сохраняю вБД должен хранить в качестве даты abc для каждой записи, так что кто-нибудь может предложить мне

1 Ответ

0 голосов
/ 24 октября 2018

Здесь возможны несколько вариантов:

Значение SQL по умолчанию

В зависимости от вашей БД вы можете добавить по умолчанию к спецификации столбца, которая будет автоматически при значениидаты этой записи при вставке.например, в postgress вы получите:

CREATE TABLE things (
    A     varchar(40) PRIMARY KEY,
    B     varchar(40) NOT NULL,
    C     varchar(40) NOT NULL,
    date  TIMESTAMP WITH TIMEZONE NOT NULL DEFAULT now()::timestamp
);

Вставка через JDBC

Если вы обрабатываете вставку в Java, вы можете просто использовать ее в своем выражении JDBC.Если вы используете подготовленное утверждение, это будет выглядеть примерно так:

OffsetDateTime dateTime = OffsetDateTime.now(ZoneOffset.UTC);
PreparedStatement st = conn.prepareStatement("INSERT INTO things VALUES (?, ?, ?, ?)");
st.setObject(1, A);
st.setObject(2, B);
st.setObject(3, C);
st.setObject(4, dateTime);
st.executeUpdate(); st.close();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...