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

时间:2021-10-05 23:24:27

Tips

做一个终身学习的人!

日拱一卒,功不唐捐。

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

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

  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插入语句的更多相关文章

  1. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  2. excel数据生成sql insert语句

    excel数据生成sql insert语句 excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用ex ...

  3. 生成大量插入语句,并将语句写入txt文件中

    import java.io.*; /** * Created by czz on 2019/9/23. */ public class TTest { /** * 生成大量插入语句,并将语句写入tx ...

  4. Springboot接口简单实现生成MySQL插入语句

    Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...

  5. &lbrack;lua&comma; mysql&rsqb; 将多条记录数据组合成一条sql插入语句&lpar;for mysql&rpar;

    -- 演示将多条记录数据组合成一条sql插入语句(for mysql) function getTpl0(tname) -- 获取表各个字段 local t = { tpl_pack = {&quot ...

  6. excel数据生成sql insert语句

    excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...

  7. 把excel数据生成sql insert语句

    excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...

  8. 小程序实现sql插入语句转换成Laravel迁移语句

    sql的插入语句长这样: INSERT INTO `media` (`MediaID`, `type`, `filename`, `title`) VALUES (1, 'word', 'word1. ...

  9. 如何通过注解Bean类来封装SQL插入语句

    整体思路是酱紫的: 给bean上注解说明该bean对应着数据库中哪张表,给每个bean的属性都注解说明各自对应着这张表的哪个字段. 通过类反射获取表名,通过逐个反射每个属性的getter方法,获取注解 ...

随机推荐

  1. 【mysql】语句优化

    论坛上看到有个类似的分割查看查询结果的梗 一时手痒就出手 治一治 比如有 A B 表A 表ID,NAME1,A2,B3,C B 表FK_ID,TYPE,VALUE1,socer,1001,socker ...

  2. 兼容解决 IE 、火狐、谷歌浏览器中 Iframe框架的页面缓存的方法

    <script type="text/javascript"> document.write('<iframe src="/ad_footer.html ...

  3. 线程实现方式以及序列化 反序列化&period;java

    一.序列化与反序列化       把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上, ...

  4. My favorite bit torrent client for Ubuntu

    Deluge Bit Torrent ClientDeluge is among my favorite bit torrent clients for Ubuntu. It is fast, sli ...

  5. url重写技术

    URL 重写是截取传入 Web 请求并自动将请求重定向到其他 URL 的过程.比如浏览器发来请求 hostname/101.aspx ,服务器自动将这个请求中定向为http://hostname/li ...

  6. UI学习笔记---第十四天数据持久化

    一.沙盒机制 每个应用程序位于文件系统的严格限制部分 每个应用程序只能在为该程序创建的文件系统中读取文件 每个应用程序在iOS系统内斗放在了统一的文件夹目录下 沙盘路径的位置 1. 通过Finder查 ...

  7. NGINX的奇淫技巧 —— 6&period; IF实现数学比较功能 &lpar;1&rpar;

    NGINX的奇淫技巧 —— 6. IF实现数学比较功能 (1) ARGUS 1月13日 发布 推荐 0 推荐 收藏 3 收藏,839 浏览 nginx的if支持=.!= 逻辑比较, 但不支持if中 & ...

  8. CentOS7 PostgreSQL 主从配置&lpar; 一&rpar;

    主库配置 pg_hba.conf host replication all 10.2.0.0/0 trust postgresql.conf listen_addresses = '*' max_wa ...

  9. hdu 1757 A Simple Math Problem &lpar;构造矩阵解决递推式问题&rpar;

    题意:有一个递推式f(x) 当 x < 10    f(x) = x.当 x >= 10  f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + ...

  10. 10970 - Big Chocolate

    题意 :已知n*m的巧克力,问需要掰多少次能让巧克力成为最小的一块: #include<iostream> using namespace std; int main() { int n, ...