数据清洗流程

2019-03-29  本文已影响0人  草珊瑚_6557

需求

给你一个包含一万五行的excel文件。
根据每行的数据作为请求参数,去请求指定接口,获取响应数据,对数据进行解析,解析结果放到excel里面输出给业务方。

第一步,获取接口响应数据,写到日志

xlsx文件转csv文本文件。
多线程读取csv文本内容,发送请求,处理响应,写入日志。
需要处理csv文本某行内容异常,接口请求异常,接口响应异常,响应内容处理异常。
对这些异常,都返回null关键字。
写到日志的数据分两块,一个是原始的响应数据,一个是自己解析后的数据。
其中多线程读取文本文件的参考代码如下:

InputStreamReader fileISR = null;
BufferedReader reader = null;

try {
    fileISR = new InputStreamReader(new FileInputStream(file), "UTF-8");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
try {
    reader = new BufferedReader(fileISR);
} catch (Exception e) {
    e.printStackTrace();
}

reader.lines().parallel().forEach(line -> {
    // 对line进行处理
});

fileISR.close();

第二步,从日志中读取所需数据,写到excel

多线程读取日志内容,解析数据,然后写到缓冲池,缓冲池刷到excel文件。

缓冲池写文件参考代码如下:

List<String> log_list = FileUtils.readLines("日志文件路径", StandardCharsets.UTF_8);
int write_flag = 1;

File file_out = null;
FileInputStream file_is = null;
XSSFWorkbook workbook_out = null;
XSSFSheet sheet_out = null;
FileOutputStream stream_output = null;
for (int i = 0; i < log_list.size(); i++) {
    String result = log_list.get(i);
    int response_result_pos = result.indexOf(字符串截取位置);

    if (response_result_pos > -1) {
        if (write_flag == 1) {
            file_out = new File(file_output_src);
            file_is = new FileInputStream(file_out);
            workbook_out = new XSSFWorkbook(file_is);
            sheet_out = workbook_out.getSheetAt(0);
            stream_output = new FileOutputStream(file_output_src);
        }

        // 业务逻辑处理代码

        write_flag = write_flag + 1;
        if (write_flag == 1000) {
            write_flag = 1;
            stream_output.flush();
            workbook_out.write(stream_output);
            stream_output.close();
        }

    }

}
if (stream_output != null) {
    stream_output.flush();
    workbook_out.write(stream_output);
    stream_output.close();
}

实际运行时间

配置未I7 CPU,8G 内存。
一万五的数据,第一步耗费20min,第二步耗费7min。

上一篇下一篇

猜你喜欢

热点阅读