require:

/**
* before:
* file A1.csv {1,2,3,4,5}
* file A2.csv {2,3,9,10,11}
* file B1.csv {5,12,13,14,15}
* file B2.csv {16,14,15,4,9,20,30}
* A1.csv A2.csv A3.csv A4.csv cant not repeat
*
* after:
* file A1.csv {1,4}
* file A2.csv {2,3,10,11}
* file B1.csv {12,13}
* file B2.csv {16,9,20,30}
*/

  

tangxin@tangxin:~/csvrepeat$ ls
A1.csv A2.csv B1.csv B2.csv

  

CSVUtilVersion2.java

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.LineIterator;
import org.springframework.util.StringUtils; import java.io.*;
import java.lang.reflect.Array;
import java.util.*; /**
* before:
* file A1.csv {1,2,3,4,5}
* file A2.csv {2,3,9,10,11}
* file B1.csv {5,12,13,14,15}
* file B2.csv {16,14,15,4,9,20,30}
* A1.csv A2.csv A3.csv A4.csv cant not repeat
*
* after:
* file A1.csv {1,4}
* file A2.csv {2,3,10,11}
* file B1.csv {12,13}
* file B2.csv {16,9,20,30}
*/
@Slf4j
public class CSVUtilVersion2 { private static final String CSV_PATH = "/home/tangxin/csvrepeat/";
private static final boolean CREATE_SWITCH = true; /**
* read single column data list
* @param path
* @return
*/
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();
if (!StringUtils.isEmpty(ID)) {
result.add(ID);
}
}
} catch (Exception e) {
log.error("读取ID csv文件失败:{}", e.getMessage());
} finally {
LineIterator.closeQuietly(it);
}
return result;
} /**
* from src delete oth
* @param src
* @param oth
* @return
*/
public static List removeAll(List src, List oth) {
LinkedList result = new LinkedList(src);
HashSet othHash = new HashSet(oth);
Iterator iter = result.iterator();
while (iter.hasNext()) {
if (othHash.contains(iter.next())) {
iter.remove();
}
}
return result;
} /**
* -Xms1g -Xmx1g -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception { //∑=1+2+3+...+(n-1) group LinkedList<String> fileList = new LinkedList<>();
fileList.add("A1.csv");
fileList.add("A2.csv");
fileList.add("B1.csv");
fileList.add("B2.csv");
// fileList.add("C1.csv"); DescartesRepeat(fileList); ded(fileList); } private static void DescartesRepeat(LinkedList<String> fileList) {
Set<String> repeatList = new HashSet<>(); Set<String> groupSet = new HashSet<>(); Set<String> goONList = new HashSet<>(); //A1->A2,B1,B2
for (int i = 0; i < fileList.size(); i++) { String itemI = fileList.get(i); for (int j = 0; j < fileList.size(); j++) { String itemJ = fileList.get(j); if (!itemI.equals(itemJ)) { String groupR1 = itemI + "->" + itemJ;
String groupR2 = itemJ + "->" + itemI; if (groupSet.contains(groupR1) || groupSet.contains(groupR2)){
continue;
} groupSet.add(groupR1); String repeatT = repeat(CSV_PATH + itemI, CSV_PATH + itemJ);
if(!StringUtils.isEmpty(repeatT)){
repeatList.add(repeatT);
//System.out.println(groupR1+"->"+repeatT);
} } }
} if (CollectionUtils.isNotEmpty(repeatList)) {
// System.out.println(repeatList);
for (String repeatItem : repeatList) {
Iterator<String> iterator = fileList.iterator();
while (iterator.hasNext()) {
String oldItem = iterator.next(); String oldS = oldItem.replace(".csv", "").replace("-new","");
String repeatS = repeatItem.replace(".csv","").replace("-new","");
if (repeatS.contains(oldS)) {
iterator.remove();
goONList.add(repeatItem);
}
}
}
fileList.addAll(goONList);
System.out.println(fileList);
DescartesRepeat(fileList);
}
} public static void ded(List<String> args) { //保证指定csv列表每组都不能有重复数据
for (int i = 0; i < args.size(); i++) {
// if(i>0){
// continue;
// } String source = CSV_PATH + args.get(i); for (int j = 0; j < args.size(); j++) { if (i == j) {
continue;
} String target = CSV_PATH + args.get(j);
intersection(source, target);
} } } public static void intersection(String sourcePath, String targetPath) {
List<String> ids1 = ids(sourcePath);
List<String> ids2 = ids(targetPath);
List<String> inter = (List<String>) CollectionUtils.intersection(ids1, ids2);
System.out.println(sourcePath + "和" + targetPath + "的重复数据大小" + inter.size());
} public static String repeat(String source, String target){
//cdd fund xyd List<String> ids1 = ids(source);
List<String> ids2 = ids(target); // System.out.println(source + "集合大小" + ids1.size());
// System.out.println(target + "集合大小" + ids2.size()); List<String> inter = (List<String>) CollectionUtils.intersection(ids1, ids2); // System.out.println("去重数据大小:" + inter.size()); if (inter != null && inter.size() > 0) { if (ids1.size() > ids2.size()) {
return repeatInner(source, ids1, inter);
} else if (ids2.size() > ids1.size()) {
return repeatInner(target, ids2, inter);
} else {
return repeatInner(source, ids1, inter);
} } return "";
} private static String repeatInner(String source, List<String> ids, List<String> inter) {
String newPath = source.replace(".csv", "-new.csv");
List<String> ids1new = removeAll(ids, inter);
createCSV(ids1new, newPath);
return newPath.replace(CSV_PATH,"");
} /**
* 创建CSV文件
*/
public static void createCSV(List<String> list, String fileName) { if(!CREATE_SWITCH){
// System.out.println("创建csv开关关闭");
return;
}else{
// System.out.println("创建csv开关开启");
} // 表格头
Object[] head = {"ID"};
List<Object> headList = Arrays.asList(head); //数据
List<List<Object>> dataList = new ArrayList<>();
List<Object> rowList = null;
for (int i = 0; i < list.size(); i++) {
rowList = new ArrayList<>();
rowList.add(list.get(i));
dataList.add(rowList);
} File csvFile;
BufferedWriter csvWtriter = null;
try {
csvFile = new File(fileName);
File parent = csvFile.getParentFile();
if (parent != null && !parent.exists()) {
parent.mkdirs();
}
csvFile.createNewFile(); // GB2312使正确读取分隔符","
csvWtriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"), 1024); // 写入文件头部
writeRow(headList, csvWtriter); // 写入文件内容
for (List<Object> row : dataList) {
writeRow(row, csvWtriter);
}
csvWtriter.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvWtriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} /**
* 写一行数据
*
* @param row 数据列表
* @param csvWriter
* @throws IOException
*/
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();
} }

  

tangxin@tangxin:~/csvrepeat$ ls
A1.csv A1-new.csv A1-new-new.csv A2.csv A2-new.csv B1.csv B2.csv B2-new.csv B2-new-new.csv

  

java csv list cant not repeat的更多相关文章

  1. Java CSV操作(导出和导入)

    Java CSV操作(导出和导入)  CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...

  2. java csv - 读写及其操作.

    今天帮同学处理数据, 主要是从1w多条记录中随机获取8k条, 然后再从8k条记录中随机获取2k条记录. 最后将2k条记录中随机分成10组,使得每组的记录都不重复. 下面将我的代码都贴上来, 好以后处理 ...

  3. java csv 文件 操作类

    一个CSV文件操作类,功能比较齐全: package tool; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...

  4. 【Java】Java CSV操作代码

    CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件中,数据“栏”以逗号分隔,可允许程序通 ...

  5. 【Java/Csv/Regex】用正则表达式去劈分带引号的csv文件行,得到想要的行数据

    csv文件是用引号分隔的文本行,为了完善内容人们又用引号把每个区块的内容又包了起来,于是形成下面的文件: "1","2","3"," ...

  6. 【Java/csv】一个CSV文件解析类(转载)

    /*下文写得不错,值得学习**/ import java.io.BufferedReader; import java.io.FileReader; import java.util.ArrayLis ...

  7. Java csv

    CsvWriter csvWriter = new CsvWriter("data2019052803.csv", ',', Charset.forName("UTF-8 ...

  8. java csv文件写入

    List<String> list_code = null; 方案1 控制字符集: BufferedWriter bw=new BufferedWriter(new OutputStrea ...

  9. 统一的Json组件和csv下载组件

    java-web-common java-web-common Json组件 目标和用途 规范Json接口格式 Controller中一律返回Java object,组件将自动转换数据格式,满足Jso ...

随机推荐

  1. Luogu P2590 [ZJOI2008]树的统计

    最近在学树剖,看到了这题就做了 [ZJOI2008]树的统计 思路 从题面可以知道,这题是树剖题(要求的和模板没什么区别呀喂 就是在普通的树剖上加了一个最大值 所以可以知道就是树剖+特殊的线段树 线段 ...

  2. [NOI2002]荒岛野人(exgcd,枚举)

    题目描述 克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi ...

  3. QString, Std::string, char *相互转换

    Qt 库中对字符串类型进行了封装,QString 类提供了所有字符串操作方法,给开发带来了便利. 由于第三方库的类型基本上都是标准的类型,即使用std::string或char *来表示字符 (串) ...

  4. 23种java设计模式之装饰者模式及动态代理

    设计模式不管对于何种语言都是存在的,这里介绍的是java的模式 装饰者模式是在二次开发中应用比较多的一款模式,当然了用反射也是可以实现的,今天介绍的是装饰模式,有兴趣的朋友可以自己去了解一下反射是怎么 ...

  5. javaScript函数封装

    本篇封装了一些常用的函数,兼容IE8及以下的浏览器,怪异模式. 按需加载loadScript().绑定事件处理函数addEvet().查看滚动尺寸getScrollOffset().查看可视区窗口尺寸 ...

  6. css3圆角矩形、盒子阴影

    css3圆角矩形 div{ width: 200px; height: 200px; border: #f00 solid 1px; margin-bottom: 10px; } 1.设置 borde ...

  7. 11个简单实用技巧--Java性能调优

    多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识.是的,这并不没有错.诚然,优化应用程序以获得最好的性能并不是一件容易的事情,但这并不意味着你在没有获得这些经验和知识之前就不能做任何事 ...

  8. 12 TCP服务器 进程 线程 非阻塞

    1.单进程服务器 from socket import * serSocket = socket(AF_INET, SOCK_STREAM) # 重复使用绑定的信息 serSocket.setsock ...

  9. A problem occurred evaluating project ':'. > ASCII

    项目编译出错: 错误信息如下: FAILURE: Build failed with an exception. * Where: Build file 'F:\git\i***\build.grad ...

  10. ubuntu下安装redis及在php中使用

    一.安装redis sudo apt-get install redis-server 安装完成后,Redis服务器会自动启动,我们可以通过下面的命令行检查一下: # redis-cli > p ...