技巧 java ftp多个数据源,整理存入同一表中

背景

  • java定时任务。
  • 定时ftp到多个目标目录,扫描获取文本文件。
  • 解析整理文本数据,存入到同一张数据表中。
  • 删除相关旧数据
  • 其中各个文本文件之间有如下特点:
    • 任一文本文件中一行即一条数据,通过分隔符分列解析入库
    • 各个文本的编码 / 分隔符 / 列顺序 / 列数量 不统一
    • 相同前缀文件名的文本 分隔符/列顺序/列数量 相同

要点

  • 解耦 提取 封装
    • ftp获取文件业务、文件文件数据对应表列业务、数据入库业务

示例

ftp获取文本文件

//获取文件
String localFileAbsPath=commMap.get("ftp_downPath")+ File.separator+file_prefixes[k]+".csv";

//1 ftp获取文件
String fromFileName=commMap.get("ftp_file_path")+File.separator+file_prefixes[k]+
        DateFormatUtils.format(DateUtils.addDays(new Date(), -1), "yyyyMMdd")+"0000.csv";
if(!getFileFromSftp(commMap,fromFileName)){
    log.error("ftp方式获取文件失败--"+fromFileName);
    continue;
}

private boolean getFileFromSftp(Map<String, String> commMap, String fromFileName){
    SFTPUtil2 sftp2Util = new SFTPUtil2(commMap.get("ftp_ip"), Integer.parseInt(commMap.get("ftp_port")),
            20000, commMap.get("ftp_user"), commMap.get("ftp_passwd"));
    boolean downSucc=false;
    if(sftp2Util.login()){
        downSucc=sftp2Util.downloadFile2(fromFileName, commMap.get("ftp_downPath"));

        String msg=(downSucc? "已获取到ftp文件:":"down file error:")+fromFileName;
        log.info(msg);
        sftp2Util.logout();
    }else{
        log.info("ftp_login_error");
    }
    return downSucc;
}

文本数据整理步骤1

 //解析文件数据
 //keys即此文本各行中各列对应的表列名,空即此列数据舍弃,竖线即此列内容会填充至两个表列中
 String[]  keys={"station_name|ne_name","","city","county","lac","update_time"};
 //文本内容
//名称|网称|区县|详细地址|LAC|上线日期
//大武酒店-H5H|5|1138774|null|null|null

 List<Map<String, Object>> mapList = FileUtils.readTxtFileNotNull(localFileAbsPath, keys, "\\|");



public static List<Map<String,Object>> readTxtFileNotNull(String filePath, String[] keys, String regex) throws IOException {
	List<Map<String,Object>> resultList= new ArrayList<>();

	File file = new File(filePath);
	if(file.isFile() && file.exists()){ //判断文件是否存在

		System.out.println("开始读取文件:"+filePath);
		String lineTxt = null;
		try (
                   InputStreamReader read = new InputStreamReader(new FileInputStream(file),getFileCharsetName(filePath));//考虑到编码格式
//                    InputStreamReader read = new InputStreamReader(new FileInputStream(file),encoding);//考虑到编码格式
                   ){

			BufferedReader bufferedReader = new BufferedReader(read);
               while((lineTxt = bufferedReader.readLine()) != null){

//                    System.out.println(lineTxt);
                   String[] split = lineTxt.split(regex);

                   Map<String,Object> map = new HashMap<>();
                   for(int i=0;i<keys.length;i++){
                       if(!"".equals(keys[i])){
						String[] keyss = keys[i].split("\\|");
						for (String s : keyss) {
							map.put(s,split[i]);
						}
//							map.put(keys[i],split[i]);
                       }
                   }
                   resultList.add(map);
               }
           } catch (Exception e) {
               System.out.println("读取文件内容出错"+lineTxt);
               e.printStackTrace();
			throw e;
		}
       }else{
           System.out.println("找不到指定的文件"+filePath);
       }

	return resultList;
}

public static String getFileCharsetName(String fileName) throws IOException {
	try(
			InputStream inputStream = new FileInputStream(fileName);
	){
		byte[] head = new byte[3];
		inputStream.read(head);

		String charsetName = "GBK";//或GB2312,即ANSI

		if (head[0] == -1 && head[1] == -2 ) //0xFFFE
			charsetName = "UTF-16";
		else if (head[0] == -2 && head[1] == -1 ) //0xFEFF
			charsetName = "Unicode";//包含两种编码格式:UCS2-Big-Endian和UCS2-Little-Endian
		else if(head[0]==-27 && head[1]==-101 && head[2] ==-98)
			charsetName = "UTF-8"; //UTF-8(不含BOM)
		else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)
			charsetName = "UTF-8"; //UTF-8-BOM

		return charsetName;
	}
}

文本数据整理步骤2

List<BaseStation> domainList=mapList2DomainList(mapList,domain,net_workg,creatTime);

    private List<BaseStation> mapList2DomainList(List<Map<String, Object>> mapList, String domain, String netWork,Date creatTime ) {

        LinkedList<BaseStation> domainList = new LinkedList<>();
        for(int i=0;i<mapList.size();i++){
            Map<String, Object> domainMap = mapList.get(i);
            BaseStation baseStationDomain = new BaseStation();

            baseStationDomain.setStationName(obj2Str(domainMap.get("station_name")));
            baseStationDomain.setNeName(obj2Str(domainMap.get("ne_name")));//'网元名称',
            。。。


private String obj2Str(Object str){
//        return str==null? "": StringUtils.isEmpty((String)str) ? null:(String)str;
    return str==null|| StringUtils.isEmpty((String)str) ? "":(String)str;
}

数据批量入库

List<BaseStation> domainList=mapList2DomainList(mapList,domain,net_workg,creatTime);

for (int i=0,j=0,betw=1000; i < domainList.size(); i+=betw) {
    j=i+betw;

//                baseStationMapper.insertOne(domainList.get(i));
    if(j<domainList.size()) {
        baseStationMapper.insertBatch(domainList.subList(i, j));
    }else{
        baseStationMapper.insertBatch(domainList.subList(i, domainList.size()));
        break;
    }
}
baseStationMapper.deleteDomainOldData(domain,net_workg,creatTime);
log.info(net_workg+"更新数据库数据完成--"+mapList.size());



  <insert id="insertBatch" >
    INSERT INTO  base_station_test
    (
      `station_name`, `ne_name`, `city`, `county`,`lac`,`update_time`
    ) VALUES
    <foreach collection ="list" item="info" separator="," >
      (
      #{info.stationName},#{info.neName},#{info.city},#{info.county},#{info.lac},#{info.updateTime}
      )
    </foreach>
  </insert>


  <delete id="deleteDomainOldData">
    <if test="lac != null  and updateTime != null">
      delete from base_station_test where lac=#{lac} update_time != #{updateTime}
    </if>
  </delete>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值