1.pom.xml配置

  1. <dependency>
  2. <groupId>commons-io</groupId>
  3. <artifactId>commons-io</artifactId>
  4. <version>2.4</version>
  5. </dependency>

2.实现

  1. package com.tangxin.kafka.service;
  2.  
  3. import org.apache.commons.io.FileUtils;
  4. import org.apache.commons.io.LineIterator;
  5. import org.springframework.util.StringUtils;
  6.  
  7. import java.io.*;
  8. import java.math.BigDecimal;
  9. import java.util.*;
  10.  
  11. /**
  12. * 两个csv文件数据去重
  13. */
  14. public class CSVDeduplication {
  15.  
  16. private static final String CSV_PATH = "I:\\";
  17.  
  18. public static List<String> ids(String path) {
  19. List<String> result = new ArrayList<>();
  20. File csv = new File(path); // CSV文件路径
  21. LineIterator it = null;
  22. try {
  23. it = FileUtils.lineIterator(csv);
  24. while (it.hasNext()) {
  25. String line = it.nextLine();
  26. if (line.trim().contains("id")) {
  27. continue;
  28. }
  29. String[] arr = line.split(",");
  30. String id = arr[0];
  31. id = id.replaceAll("\"", "").trim();
  32. result.add(id);
  33. }
  34. } catch (Exception e) {
  35. } finally {
  36. LineIterator.closeQuietly(it);
  37. }
  38. return result;
  39. }
  40.  
  41. public static void main(String[] args) throws Exception {
  42. String path1 = CSV_PATH+"100w.csv";
  43. String path2 = CSV_PATH+"300w.csv";
  44.  
  45. List<String> ids1 = ids(path1);
  46. Set<String> idSet1 = new HashSet<>();
  47. Set<String> idSet2 = new HashSet<>();
  48.  
  49. for (int i = 0; i < ids1.size(); i++) {
  50. if(StringUtils.isEmpty(ids1.get(i))){
  51. continue;
  52. }
  53. idSet1.add(ids1.get(i));
  54. }
  55.  
  56. List<String> ids2 = ids(path2);
  57.  
  58. for (int i = 0; i < ids2.size(); i++) {
  59. if(StringUtils.isEmpty(ids2.get(i))){
  60. continue;
  61. }
  62. idSet2.add(ids2.get(i));
  63. }
  64.  
  65. System.out.println("用户100万=" + idSet1.size());
  66. System.out.println("用户300万=" + idSet2.size());
  67. BigDecimal b1 = new BigDecimal(idSet1.size());
  68. BigDecimal b2 = new BigDecimal(idSet2.size());
  69. BigDecimal b3 = b1.add(b2);
  70. System.out.println("用户100万和用户300万="+b3.toString());
  71.  
  72. List<String> ids4 = new ArrayList<>();//重复数据
  73.  
  74. Set<String> ids3 = new HashSet<>();
  75.  
  76. Iterator<String> iterator1 = idSet1.iterator();
  77. while (iterator1.hasNext()){
  78. String t1 = iterator1.next();
  79. ids3.add(t1);
  80. }
  81.  
  82. Iterator<String> iterator2 = idSet2.iterator();
  83. while (iterator2.hasNext()){
  84. String t1 = iterator2.next();
  85. ids3.add(t1);
  86. }
  87.  
  88. System.out.println("用户100万和用户300万去重=" + ids3.size());
  89.  
  90. ids1.removeAll(ids3);
  91. ids2.removeAll(ids3);
  92. ids4.addAll(ids1);
  93. ids4.addAll(ids2);
  94. System.out.println("用户100万和用户300万重复="+ids4.size());
  95.  
  96. Set<String> fiveMillion = splitHeadData(ids3, 50000);
  97.  
  98. System.out.println("5W用户推送数据:" + fiveMillion.size());
  99.  
  100. List<String> staffsList = new ArrayList<>(fiveMillion);
  101.  
  102. createCSV(staffsList,"5w.csv");
  103.  
  104. System.out.println("剩余推送总数:" + ids3.size());
  105.  
  106. System.out.println("============剩余总数每50w分页显示=================");
  107.  
  108. List<List<String>> pageListTotal = pageList(ids3,500000);
  109.  
  110. for (int i = 0; i < pageListTotal.size(); i++) {
  111. List<String> items = pageListTotal.get(i);
  112. createCSV(items,"50w"+i+".csv");
  113. }
  114.  
  115. }
  116.  
  117. public static Set<String> splitHeadData(Set<String> mySet, int size) {
  118. Set<String> result = new HashSet<>();
  119. Iterator<String> iterator = mySet.iterator();
  120. int count = 0;
  121. while (iterator.hasNext()) {
  122. if (count == size) {
  123. break;
  124. }
  125. result.add(iterator.next());
  126. count++;
  127. }
  128. mySet.removeAll(result);
  129. return result;
  130. }
  131.  
  132. /**
  133. * 分页list的id数据
  134. * @return
  135. */
  136. public static List<List<String>> pageList(Set<String> totalSet, int pageSize) {
  137. List<List<String>> allIdList = new ArrayList<>();
  138. List<String> idList = new ArrayList<>();
  139. Iterator<String> it = totalSet.iterator();
  140. int count = 0;
  141. while (it.hasNext()) {
  142. String id = it.next();
  143. if (count > pageSize) {
  144. allIdList.add(idList);
  145. count = 0;
  146. idList = new ArrayList<>();
  147. }
  148. idList.add(id);
  149. count++;
  150. }
  151. if (idList.size() > 0) {
  152. allIdList.add(idList);
  153. }
  154. return allIdList;
  155. }
  156.  
  157. /**
  158. * 创建CSV文件
  159. */
  160. public static void createCSV(List<String> list,String fileName) {
  161.  
  162. // 表格头
  163. Object[] head = {"id"};
  164. List<Object> headList = Arrays.asList(head);
  165.  
  166. //数据
  167. List<List<Object>> dataList = new ArrayList<>();
  168. List<Object> rowList;
  169. for (int i = 0; i < list.size(); i++) {
  170. rowList = new ArrayList<>();
  171. rowList.add(list.get(i));
  172. dataList.add(rowList);
  173. }
  174.  
  175. String filePath = CSV_PATH; //文件路径
  176.  
  177. File csvFile;
  178. BufferedWriter csvWriter = null;
  179. try {
  180. csvFile = new File(filePath + fileName);
  181. File parent = csvFile.getParentFile();
  182. if (parent != null && !parent.exists()) {
  183. parent.mkdirs();
  184. }
  185. csvFile.createNewFile();
  186.  
  187. // GB2312使正确读取分隔符","
  188. csvWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024);
  189.  
  190. // 写入文件头部
  191. writeRow(headList, csvWriter);
  192.  
  193. // 写入文件内容
  194. for (List<Object> row : dataList) {
  195. writeRow(row, csvWriter);
  196. }
  197. csvWriter.flush();
  198. } catch (Exception e) {
  199. e.printStackTrace();
  200. } finally {
  201. try {
  202. csvWriter.close();
  203. } catch (IOException e) {
  204. e.printStackTrace();
  205. }
  206. }
  207. }
  208.  
  209. private static void writeRow(List<Object> row, BufferedWriter csvWriter) throws IOException {
  210. for (Object data : row) {
  211. StringBuffer sb = new StringBuffer();
  212. String rowStr = sb.append("\"").append(data).append("\",").toString();
  213. csvWriter.write(rowStr);
  214. }
  215. csvWriter.newLine();
  216. }
  217.  
  218. }

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:

  1. -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. SQL之Case when 语句

    --case简单函数 (把多列变成单列) ' then '女' when ' then '男' else '其他' end from [Northwind].[dbo].[Users] --case搜 ...

  2. A的B次幂

    Description 给出两个正整数A和B 请输出A的B次幂 结果可能很大,请对1000000007求模 Input A和B,两个整数均不大于10^18 Output A的B次幂对100000000 ...

  3. BZOJ1050: [HAOI2006]旅行comf(并查集 最小生成树)

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4021  Solved: 2257[Submit][Status][Discuss] Descript ...

  4. 【杂题总汇】UVa-10618 Tango Tango Insurrection

    [UVa-10618] Tango Tango Insurrection ◇ 题目 +vjudge 链接+ (以下选自<算法竞赛入门经典>-刘汝佳,有删改) <题目描述> 你想 ...

  5. Hutool Wiki For java

    发现一款不错的java工具类, http://www.hutool.cn/ Hutool的使用文档. 项目见 https://github.com/looly/hutool 以及 http://git ...

  6. zeppelin ERROR总结

    ERROR [2017-03-23 20:01:50,799] ({qtp331657670-221} NotebookServer.java[onMessage]:221) - Can't hand ...

  7. 【Kaggle】泰坦尼克号

    引言 Kaggle官方网站 这是泰坦尼克号事件的基本介绍: 我们需要做的就是通过给出的数据集,通过对特征值的分析以及运用机器学习模型,分析什么样的人最可能存活,并给出对测试集合的预测. 对于Kaggl ...

  8. Uva12230Crossing Rivers 数学

    Uva12230Crossing Rivers 问题: You live in a village but work in another village. You decided to follow ...

  9. python——集合

    在python中,字典的亲戚就是集合,集合就是无映射关系的字典,花括号并不是字典的特权.如下面程序所示: >>> num = {} >>> type(num) &l ...

  10. Ubuntu下配置LAMP + PhpStorm

    本文仅作为一个记录,以下配置在Ubuntu 14.10 64-bit上验证通过. 安装Apache 2:sudo apt-get install apache2 安装成功能够后,通过浏览器访问loca ...