美文网首页代码改变世界程序员
比较两个文件不同以及生成SQL插入语句

比较两个文件不同以及生成SQL插入语句

作者: 码匠安徒生 | 来源:发表于2017-10-14 23:15 被阅读331次

    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());\r",
                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文件

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

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

    相关文章

      网友评论

      • 廖马儿:喜欢你说的终身学习原则。我也是这样想的。
        码匠安徒生:多谢!主要是现在技术更新太快了,不持续学习的话,很快就落伍了。

      本文标题:比较两个文件不同以及生成SQL插入语句

      本文链接:https://www.haomeiwen.com/subject/jqtquxtx.html