比较两个文件不同以及生成SQL插入语句
Tips
做一个终身学习的人!
日拱一卒,功不唐捐。

今天有个小小的需求,具体需求是这样的:
- 有两个文本文件,每个文件都有一些字符串文本;
- 比较第一个文件中,在第二个文件中,不存在的字符串文本;
- 把这些在第二个文件中不存在的文本,拼接成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插入语句
将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...
- excel数据生成sql insert语句
excel数据生成sql insert语句 excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用ex ...
- 生成大量插入语句,并将语句写入txt文件中
import java.io.*; /** * Created by czz on 2019/9/23. */ public class TTest { /** * 生成大量插入语句,并将语句写入tx ...
- Springboot接口简单实现生成MySQL插入语句
Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...
- [lua, mysql] 将多条记录数据组合成一条sql插入语句(for mysql)
-- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {" ...
- excel数据生成sql insert语句
excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
- 把excel数据生成sql insert语句
excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
- 小程序实现sql插入语句转换成Laravel迁移语句
sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1. ...
- 如何通过注解Bean类来封装SQL插入语句
整体思路是酱紫的: 给bean上注解说明该bean对应着数据库中哪张表,给每个bean的属性都注解说明各自对应着这张表的哪个字段. 通过类反射获取表名,通过逐个反射每个属性的getter方法,获取注解 ...
随机推荐
- 探索JSP中的 "9大内置对象!"
1.什么是JSP内置对象? jsp内置对象就是Web容器创建的一组对象,我们都知道Tomcat可以看成是一种Web容器,所以我们可以知道所谓的内置对象Tomcat创建的,使用内置对象时可以不适用new ...
- 王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍
在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌 ...
- 事后诸葛亮分析(Beta阶段)
设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决用户想要随时锻炼四则运算能力的问题:定义的很清楚:有清晰描述. 2.是否有充足的时间来做计划? ...
- 第02周-Java作业评价
1. 本周作业简评与建议 作业存在的问题 格式上还是存在问题,但是比较第一次有很大的进步. 答题上,有的同学还是很敷衍,题目要求有分析过程,但是只写一个false,true,没有分析.也比较缺少自己的 ...
- 201521123117 《Java程序设计》第6周学习总结
1. 本周学习总结 2. 书面作业 Q1.clone方法 1.Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么? 答:在自定义的类中覆盖cl ...
- 201521123029《Java程序设计》第十二周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...
- day2_操作系统
一.为什么要有操作系统 因为计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成.现代计算机系统复杂 每位计算机程序员不可能全部的掌 ...
- SVN使用【介绍SVN、快速入门、解决冲突】
什么是SVN SVN全称:Subversion,是一个开放源代码的版本控制系统 Svn是一种集中式文件版本管理系统.集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器获取代码, ...
- bookStore案例第一篇【部署开发环境、解决分类模块】
前言 巩固Servlet+JSP开发模式,做一个比较完整的小项目 成果图 该项目包含了两个部分,前台和后台. 前台用于显示 后台用于管理 该项目可分为5个模块来组成:分类模块,用户模块,图书模块,购买 ...
- open和opener使用說明
父網頁:window.open("article.html")子網頁:var dialoginfo=$('#dialogdata',window.opener.document); ...