比较两个文件不同以及生成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方法,获取注解 ...
随机推荐
- 部署自己的GitLab
先说明一下自己的想法:无论怎么样,个人确实先不想升级到centos7上面,因为我觉得centos6还是比较占用资源少的,而且作为生产环境,centos6完全够用了. 实验测试环境: * centos ...
- 团队作业7——Alpha冲刺之事后诸葛亮
Deadline: 2017-5-15 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分,检查的项目内容为事后诸葛亮分析报告 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 ...
- SNS团队第二次站立会议(2017.04.23)
一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 梳理清楚数据的每个类型和数据项 具体落实把相关数据 ...
- 第二次项目冲刺(Beta阶段)--第七天
一.站立式会议照片 二.项目燃尽图 三.项目进展 codingnet:https://git.coding.net/tuoxie/chachong-beta.git 1.对项目进行全面的测试 2.继续 ...
- 201521123085 《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 要注意到在删除元素 ...
- 201521123055《Java程序设计》第1周学习总结
1. 本章学习总结 (1)JAVA环境配置(JDK,JVM) (2)编写简易程序熟练代码结构 2. 书面作业 1.为什么java程序可以跨平台运行?执行java程序的步骤是什么? JAVA程序需要 ...
- update:我的Emacs配置文件
;;设置字体用的 防止中文变成无法识别的框框 (set-default-font "Consolas-11") (set-fontset-font "fontset-d ...
- Java课程设计——学生基本信息管理
1.团队名称.团队成员介绍 团队名称:学生基本信息管理设计小组 团队成员:花雨芸(组长)--负责管理界面的编写 丁蓉(组员)--负责登陆的设计编写 2.项目git地址 https://git.osch ...
- thymeleaf模板引擎调用java类中的方法(附源码)
前言 <Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦> 由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决 ...
- 《Head First 设计模式》读书笔记(1) - 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...