数据清洗流程
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。