比较两个文件不同以及生成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());\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文件

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

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

posted @ 2017-10-14 23:18  林本托  阅读(1099)  评论(0编辑  收藏  举报