zoukankan      html  css  js  c++  java
  • 比较两个文件不同以及生成SQL插入语句

    Tips
    做一个终身学习的人!
    日拱一卒,功不唐捐。

    Java Duke

    今天有个小小的需求,具体需求是这样的:

    1. 有两个文本文件,每个文件都有一些字符串文本;
    2. 比较第一个文件中,在第二个文件中,不存在的字符串文本;
    3. 把这些在第二个文件中不存在的文本,拼接成SQL的插入语句,写入到文件中。

    具体第一个文件中的内容是这样的:

    Java
    Redis
    Spring   
    Hibernate
    Spring MVC
    Dubbo
    RabbitMq
    

    第二个文件中的内容如下:

    Java 9
    ZooKepper
    MongoDB
    Spring Boot
    Git
    Spring MVC
    Mybatis
    Memcache
    Dubbo
    RabbitMq
    

    其实,这个小功能很简单,逻辑也不复杂,就是一个可能大家比较常用的一个小工具。

    根据我的思路,我主要使用了以下技术和工具:

    • Java 8 Lambda表达式;
    • Java 8 中提供的集合stream方法;
    • Google Guava 工具提供了集合比较的方法。

    具体看代码:

    package com.howtoprogram;
    
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    import com.google.common.collect.Sets;
    
    /**
     * Created by 324779.
     * 比较两个文件中文本内容的不同,把第一个文本中不同的部分挑选出来,
     * 拼成对应的insert语句,
     * 最后写入文件中。
     */
    public class FilterDifferWords {
    
        public static void main(String[] args) throws IOException {
    	    Path txtFile = Paths.get("/Users/i324779/Documents/test.txt");
    	    List<String> txtContent = loadContentFromFile(txtFile);
    
    	    Path csvFile = Paths.get("/Users/i324779/Documents/test.csv");
    	    List<String> csvContent = loadContentFromFile(csvFile);
    	
    	    // List 转换为Set是为了文本内容去重
    	    // 使用Google Guava工具中的Sets类
    	    Set<String> differContent = Sets.difference(new HashSet<>(txtContent), new HashSet<>(csvContent));
    
    	    List<String> insertSqls = spliceSql(differContent);
    
    	    writeToFile(insertSqls);
        } // end method main
    
        /**
         * @param filePath 文件路径
         * @return 读取文件中内容到列表中。
         * @throws IOException
         */
        private static List<String> loadContentFromFile(Path filePath) throws IOException {
    	    return Files.readAllLines(filePath).stream()
    		    .map(String::trim) // 去掉文本的空格
                .filter(line -> !("".equals(line))) // 过滤空行
    		    .collect(Collectors.toList());
        } // end method loadContentFromFile
    
        /**
         * 	拼装insert语句,使用MYSQL数据库的语法
         * @param differContent 两个文本比较后,第一个文本有,而第二个文本没有的内容。
         * @return 拼装好insert语句的列表
         */
          private static List<String> spliceSql(Set<String> differContent) {
    	    return differContent.stream()
                .flatMap(line -> Stream.of(String.format(
    		    "INSERT INTO test(search, replacement, level, expire, create_time) "
    		    + "VALUES ('%s', '*', 0, '2099-12-31 23:59:59', now());
    ",
    		    line)))
    		    .collect(Collectors.toList());
        } // end method spliceSql
    
        /**
         * 把列表中的sql语句写入文件中
         * @param insertSqls 拼装好insert语句的列表
         * @throws IOException
         */
        private static void writeToFile(List<String> insertSqls) throws IOException {
    	    Path sqlFile = Paths.get("/Users/i324779/Documents/insertSql.txt");
    	    Files.write(sqlFile, insertSqls);
        } // end method writeToFile
        
    } // end class FilterDifferWords
    
    

    执行结果为:

    sql文件

    如果你有这样类似的需求,只需要把文件路径修改一下即可。

    哈哈,程序员是一群为了偷懒而最勤奋想办法的一类人。

  • 相关阅读:
    解决:Google代码achartengine曲线代码报错问题(转)
    操作SQLite数据库
    让服务器iis支持.apk文件下载的设置方法
    怎么在手机上查看sqlite db
    Android 3D滑动菜单完全解析,实现推拉门式的立体特效
    android自动更新程序,安装完以后就什么都没有了,没有出现安装成功的界面的问题
    那些年不错的Android开源项目
    PL/SQL Developer 连接新数据库
    Oracle 连接 Visual Studio 的工具
    利用SQLiteOpenHelper来管理SQLite数据库 (转)
  • 原文地址:https://www.cnblogs.com/IcanFixIt/p/7668983.html
Copyright © 2011-2022 走看看