1.pom.xml配置

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>

2.实现

package com.tangxin.kafka.service;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.springframework.util.StringUtils; import java.io.*;
import java.math.BigDecimal;
import java.util.*; /**
* 两个csv文件数据去重
*/
public class CSVDeduplication { private static final String CSV_PATH = "I:\\"; public static List<String> ids(String path) {
List<String> result = new ArrayList<>();
File csv = new File(path); // CSV文件路径
LineIterator it = null;
try {
it = FileUtils.lineIterator(csv);
while (it.hasNext()) {
String line = it.nextLine();
if (line.trim().contains("id")) {
continue;
}
String[] arr = line.split(",");
String id = arr[0];
id = id.replaceAll("\"", "").trim();
result.add(id);
}
} catch (Exception e) {
} finally {
LineIterator.closeQuietly(it);
}
return result;
} public static void main(String[] args) throws Exception {
String path1 = CSV_PATH+"100w.csv";
String path2 = CSV_PATH+"300w.csv"; List<String> ids1 = ids(path1);
Set<String> idSet1 = new HashSet<>();
Set<String> idSet2 = new HashSet<>(); for (int i = 0; i < ids1.size(); i++) {
if(StringUtils.isEmpty(ids1.get(i))){
continue;
}
idSet1.add(ids1.get(i));
} List<String> ids2 = ids(path2); for (int i = 0; i < ids2.size(); i++) {
if(StringUtils.isEmpty(ids2.get(i))){
continue;
}
idSet2.add(ids2.get(i));
} System.out.println("用户100万=" + idSet1.size());
System.out.println("用户300万=" + idSet2.size());
BigDecimal b1 = new BigDecimal(idSet1.size());
BigDecimal b2 = new BigDecimal(idSet2.size());
BigDecimal b3 = b1.add(b2);
System.out.println("用户100万和用户300万="+b3.toString()); List<String> ids4 = new ArrayList<>();//重复数据 Set<String> ids3 = new HashSet<>(); Iterator<String> iterator1 = idSet1.iterator();
while (iterator1.hasNext()){
String t1 = iterator1.next();
ids3.add(t1);
} Iterator<String> iterator2 = idSet2.iterator();
while (iterator2.hasNext()){
String t1 = iterator2.next();
ids3.add(t1);
} System.out.println("用户100万和用户300万去重=" + ids3.size()); ids1.removeAll(ids3);
ids2.removeAll(ids3);
ids4.addAll(ids1);
ids4.addAll(ids2);
System.out.println("用户100万和用户300万重复="+ids4.size()); Set<String> fiveMillion = splitHeadData(ids3, 50000); System.out.println("5W用户推送数据:" + fiveMillion.size()); List<String> staffsList = new ArrayList<>(fiveMillion); createCSV(staffsList,"5w.csv"); System.out.println("剩余推送总数:" + ids3.size()); System.out.println("============剩余总数每50w分页显示================="); List<List<String>> pageListTotal = pageList(ids3,500000); for (int i = 0; i < pageListTotal.size(); i++) {
List<String> items = pageListTotal.get(i);
createCSV(items,"50w"+i+".csv");
} } public static Set<String> splitHeadData(Set<String> mySet, int size) {
Set<String> result = new HashSet<>();
Iterator<String> iterator = mySet.iterator();
int count = 0;
while (iterator.hasNext()) {
if (count == size) {
break;
}
result.add(iterator.next());
count++;
}
mySet.removeAll(result);
return result;
} /**
* 分页list的id数据
* @return
*/
public static List<List<String>> pageList(Set<String> totalSet, int pageSize) {
List<List<String>> allIdList = new ArrayList<>();
List<String> idList = new ArrayList<>();
Iterator<String> it = totalSet.iterator();
int count = 0;
while (it.hasNext()) {
String id = it.next();
if (count > pageSize) {
allIdList.add(idList);
count = 0;
idList = new ArrayList<>();
}
idList.add(id);
count++;
}
if (idList.size() > 0) {
allIdList.add(idList);
}
return allIdList;
} /**
* 创建CSV文件
*/
public static void createCSV(List<String> list,String fileName) { // 表格头
Object[] head = {"id"};
List<Object> headList = Arrays.asList(head); //数据
List<List<Object>> dataList = new ArrayList<>();
List<Object> rowList;
for (int i = 0; i < list.size(); i++) {
rowList = new ArrayList<>();
rowList.add(list.get(i));
dataList.add(rowList);
} String filePath = CSV_PATH; //文件路径 File csvFile;
BufferedWriter csvWriter = null;
try {
csvFile = new File(filePath + fileName);
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile(); // GB2312使正确读取分隔符","
csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024); // 写入文件头部
writeRow(headList, csvWriter); // 写入文件内容
for (List<Object> row : dataList) {
writeRow(row, csvWriter);
}
csvWriter.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
for (Object data : row) {
StringBuffer sb = new StringBuffer();
String rowStr = sb.append("\"").append(data).append("\",").toString();
csvWriter.write(rowStr);
}
csvWriter.newLine();
} }

3.开始的实现思路和后面的实现思路

3.1 开始的实现思路

读取文件1.csv,数据大概有100多万 读取文件2.csv,数据大概有300多万,然后用100万和300万的数据一个个去比较看哪些已经存在了,两个for循环,100万*300万=3万亿次 卡着不动放弃了。

然后想着用多线程把300万数据分页成每50万来跑也是跑的很。

3.2 后面的实现思路

代码就在上面,整体思路就是通过java的Set集合来去重复,因为java单个循环处理还是很快的,注意需要配置jvm参数来跑不然会内存溢出:

VM options:

-Xms1g -Xmx1g -XX:SurvivorRatio=2 -XX:+UseParallelGC

java 两个csv文件数据去重的更多相关文章

  1. python读取两个csv文件数据,进行查找匹配出现次数

    现有需求 表1 表2 需要拿表1中的编码去表2中的门票编码列匹配,统计出现的次数,由于表2编码列是区域间,而且列不是固定的,代码如下 #encoding:utf-8 ##导入两个CSV进行比对 imp ...

  2. java读取目录下所有csv文件数据,存入三维数组并返回

    package dwzx.com.get; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; ...

  3. jmeter参数化、添加变量、生成随机数和导入csv文件数据

    Remarks:本次使用jmeter版本为4.0 以下数据都在必应中演示: 添加普通变量 1.添加 User Defined Variables(用户自定义变量) 2.设置变量 3.使用变量 4.查看 ...

  4. CSV文件数据如何读取、导入、导出到新的CSV文件中以及CSV文件的创建

    CSV文件数据如何读取.导入.导出到新的CSV文件中以及CSV文件的创建 一.csv文件的创建 (1)新建一个文本文档: 打开新建文本文档,进行编辑. 注意:关键字与关键字之间用英文半角逗号隔开.第一 ...

  5. HttpRunner学习7--引用CSV文件数据

    前言 在之前的文章中,我们已经学习了 parameters 参数化,是在测试脚本中直接指定参数列表.这种方法简单易用,但如果我们的参数列表数据比较多,这种方法可能就不太适合了. 当数据量比较大的时候, ...

  6. C#使用Linq to csv读取.csv文件数据

    前言:今日遇到了一个需要读取CSV文件类型的EXCEL文档数据的问题,原本使用NPOI的解决方案直接读取文档数据,最后失败了,主要是文件的类型版本等信息不兼容导致.其他同事有使用linq to csv ...

  7. C语言进行csv文件数据的读取

    C语言进行csv文件数据的读取: #include <stdio.h> #include <string.h> #include <malloc.h> #inclu ...

  8. java调用sqlldr导入csv文件数据到临时表

    package cn.com.file;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File; ...

  9. java导出生成csv文件

    首先我们需要对csv文件有基础的认识,csv文件类似excel,可以使用excel打开,但是csv文件的本质是逗号分隔的,对比如下图: txt中显示: 修改文件后缀为csv后显示如下: 在java中我 ...

随机推荐

  1. HTTP 之缓存

    这是一篇知识性的文档,主要目的是为了让Web缓存相关概念更容易被开发者理解并应用于实际的应用环境中.为了简要起见,某些实现方面的细节被简化或省略了.如果你更关心细节实现则完全不必耐心看完本文,后面参考 ...

  2. data-ng-hide指令用于隐藏或显示HTML元素

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  3. JavaScript中基本知识

    变量 每个变量仅仅是一个用于保存值的占位符而已. 用var操作符定义的变量将成为定义该变量的作用域中的局部变量. 省略var操作符可以定义一个全局变量.但是不推荐这种做法,因为在局部作用域中定义的全局 ...

  4. MyString类的实现--基础中的基础C语言

    MyString 类是学习 C++ 的过程中一个很重要的例子,涉及到面向对象的封装.堆内存申请和释放.函数的重载以及 C++ 的 “Big Three”.本例子重点在于复习和理解上述的 C++ 特性, ...

  5. JS - 给数组的原型添加去掉重复元素的distinct方法

    /* 调用完该方法,原数组只留下非重复的数据 返回一个数组,里面是依次出现的重复元素 */Array.prototype.distinct = function () {    var removeA ...

  6. Docker自学纪实(三)Docker容器数据持久化

    谈起数据卷 我一直觉得是个枯燥无聊的话题 但是通过今天的实操和阅读 我发现其实并不是 其实就像走夜路 没有光明,第一次都是恐惧 但是如果走的次数多了 或者静下心来去克制恐惧 也许就会驾轻就熟或者等到黎 ...

  7. BZOJ 1441: Min(裴蜀定理)

    BZOJ 1441:Min Description 给出n个数(A1...An)现求一组整数序列(X1...Xn)使得S=A1*X1+...An*Xn>0,且S的值最小 Input 第一行给出数 ...

  8. SAP(ABAP):STOP,EXIT,CHECK,RETURN,REJECT,CONTINUE

    Stop 命令使用该命令的程序位置INITIALIZATION, AT SELECTION-SCREEN, START-OF-SELECTION和GET 事件中处理说明1. 当在INITIALIZAT ...

  9. python基础之正则表达式和re模块

    正则表达式 就其本质而言,正则表达式(或 re)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 ...

  10. spark streaming的应用

    今天我们讲spark streaming的应用,这个是实时处理的,类似于Storm以及Flink相关的知识点, 说来也巧,今天的自己也去听了关于Flink的相关的讲座,可惜自己没有听得特别清楚,好像是 ...