package com.mobile.web.api;
import com.mobile.commons.JsonResp;
import com.mobile.model.LogInfo;
import com.mobile.service.LogInfoService;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
@RestController
@RequestMapping(value= "/test")
@Transactionalpublic classImportController {
Logger log= Logger.getLogger(this.getClass());
@AutowiredprivateLogInfoService logInfoService;
@RequestMapping(value= "/importTxt", method =RequestMethod.GET)publicJsonResp importTxt() throws IOException, ParseException {
log.debug("开始导入数据");
String encoding= "GBK";
List logInfoList= newArrayList();
String dir= "E:\\test\\log";
File[] files= newFile(dir).listFiles();for(File file : files){ //循环文件夹中的文件if (file.isFile() && file.exists()) { //判断文件是否存在
importFile(file, encoding, logInfoList); //将文件中的数据读取出来,并存放进集合中
}else{return JsonResp.toFail("文件不存在,请检查文件位置!");
}
}
Boolean insertFlag=logInfoService.insertBatch(logInfoList); //将集合中的数据批量入库if (!insertFlag) {return JsonResp.toFail("保存失败");
}returnJsonResp.ok();
}
/** 读取数据,存入集合中 */public static voidimportFile(File file, String encoding, List logInfoList) throws IOException, ParseException {
InputStreamReader read= null;//考虑到编码格式
try{
read= newInputStreamReader(newFileInputStream(file), encoding); //输入流
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}catch(FileNotFoundException e) {
e.printStackTrace();
}
BufferedReader bufferedReader= newBufferedReader(read);
String lineTxt= null;
SimpleDateFormat sdf= new SimpleDateFormat("[dd/MMM/yyyy:HH:mm:ss Z]", Locale.US); //时间格式化,此处有坑,下边会说到while ((lineTxt = bufferedReader.readLine()) != null) { //读取文件内容
String[] lineArr= lineTxt.split(" ");int len =lineArr.length;
LogInfo logInfo= newLogInfo(); //封装实体对象做入库准备
String logDate= lineArr[0] + " " + lineArr[1];
System.out.println(sdf.parse(logDate)); //.............时间转换问题
logInfo.setLog1(sdf.parse(logDate));
logInfo.setLog2(lineArr[2]);
logInfo.setLog3(lineArr[3]);
logInfo.setLog4(lineArr[4]);
logInfo.setLog5(lineArr[5].substring(1, lineArr[5].length() - 1));
logInfo.setLog6(lineArr[6].substring(1));
logInfo.setLog8(lineArr[7].substring(0, lineArr[7].length() - 1));
String accessUrl= lineArr[7];
String[] accessUrlArr= accessUrl.split("/");
logInfo.setItemName(accessUrlArr[3]);
logInfo.setLog9(lineArr[8]);
logInfo.setLog10(lineArr[9]);
logInfo.setLog11(lineArr[10]);
logInfo.setLog12(lineArr[11]);
String[] uaHead= new String[len - 13];
System.arraycopy(lineArr,12, uaHead, 0, len - 13);//数组拷贝,a表示源数组,b表示源数组要复制的起始位置,c表示目标数组,d表示目标数组起始位置,e表示要复制的长度。
logInfo.setLog13(StringUtils.join(uaHead));
logInfo.setFileType(lineArr[len- 1]);
logInfoList.add(logInfo);
}
read.close(); //输入流关闭
}}