Java 将CSV文件列中的类似项分组为主键
我有一个大的CSV文件,数据与此类似Java 将CSV文件列中的类似项分组为主键,java,csv,Java,Csv,我有一个大的CSV文件,数据与此类似 User ID Group ABC Group1 DEF Group2 ABC Group3 GHI Group4 XYZ Group2 UVW Group5 XYZ Group1 ABC Group1 DEF Group2 我需要以这样的方式对这些项目进行分组
User ID Group
ABC Group1
DEF Group2
ABC Group3
GHI Group4
XYZ Group2
UVW Group5
XYZ Group1
ABC Group1
DEF Group2
我需要以这样的方式对这些项目进行分组,即在用户id中重复group属性的次数,并获得这样的值
ABC Group1 ->2
ABC Group3 ->1
DEF Group2 ->2
GHI Group4 ->1
UVW Group5 ->1
XYZ Group2 ->1
XYZ Group1 ->1
有任何聚类算法可以做到这一点。一个非常简单的解决方案是使用Guava的TreeMultiset: 创建一个具有userId和group字段的类UserGroup,并让它实现Comparable,首先比较userId,然后比较group 读取csv文件,每行创建一个用户组,并将其添加到MultiSet 要获得结果,请使用MultiSet.iterator()和print entry.getElement()和entry.getCount()
如果内存不足,并且无法分配足够的内存,可以使用外部(合并)排序一个非常简单的解决方案是使用Guava的TreeMultiset: 创建一个具有userId和group字段的类UserGroup,并让它实现Comparable,首先比较userId,然后比较group 读取csv文件,每行创建一个用户组,并将其添加到MultiSet 要获得结果,请使用MultiSet.iterator()和print entry.getElement()和entry.getCount()
如果内存不足,并且无法分配足够的内存,可以使用外部(合并)排序一个非常简单的解决方案是使用Guava的TreeMultiset: 创建一个具有userId和group字段的类UserGroup,并让它实现Comparable,首先比较userId,然后比较group 读取csv文件,每行创建一个用户组,并将其添加到MultiSet 要获得结果,请使用MultiSet.iterator()和print entry.getElement()和entry.getCount()
如果内存不足,并且无法分配足够的内存,可以使用外部(合并)排序一个非常简单的解决方案是使用Guava的TreeMultiset: 创建一个具有userId和group字段的类UserGroup,并让它实现Comparable,首先比较userId,然后比较group 读取csv文件,每行创建一个用户组,并将其添加到MultiSet 要获得结果,请使用MultiSet.iterator()和print entry.getElement()和entry.getCount()
如果内存不足,并且无法分配足够的内存,可以使用外部(合并)排序在您的情况下,如果您不想在内存中存储所有数据,我会这样做:
public class Tester {
public static Multiset<String> getMultisetFromCSV(String csvFileName, String lineDelimiter) throws IOException {
Multiset<String> mapper = TreeMultiset.create();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(csvFileName));
String[] currLineSplitted;
while(reader.ready()) {
currLineSplitted = reader.readLine().split(lineDelimiter);
mapper.add(currLineSplitted[0] + "-" + currLineSplitted[1]);
}
return mapper;
} finally {
if(reader != null)
reader.close();
}
}
public static void main(String[] args) throws IOException {
Multiset<String> set = getMultisetFromCSV("csv", ",");
for(String key : set.elementSet()) {
System.out.println(key + " : " + set.count(key));
}
}
公共类测试器{
公共静态多集getMultisetFromCSV(字符串csvFileName,字符串lineDelimiter)引发IOException{
Multiset mapper=TreeMultiset.create();
BufferedReader reader=null;
试一试{
reader=newbufferedreader(newfilereader(csvFileName));
字符串[]currLineSplitted;
while(reader.ready()){
currLineSplitted=reader.readLine().split(lineDelimiter);
add(currLineSplitted[0]+“-”+currLineSplitted[1]);
}
返回映射器;
}最后{
if(读卡器!=null)
reader.close();
}
}
公共静态void main(字符串[]args)引发IOException{
Multiset set=getMultisetFromCSV(“csv”,“,”);
for(字符串键:set.elementSet()){
System.out.println(key+”:“+set.count(key));
}
}
}
通过这种方式,您可以非常轻松地构建地图。之后,对于每个键,您可以使用计数键来计算与之关联的项数。在您的情况下,如果您不想将所有数据存储在内存中,我会这样做:
public class Tester {
public static Multiset<String> getMultisetFromCSV(String csvFileName, String lineDelimiter) throws IOException {
Multiset<String> mapper = TreeMultiset.create();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(csvFileName));
String[] currLineSplitted;
while(reader.ready()) {
currLineSplitted = reader.readLine().split(lineDelimiter);
mapper.add(currLineSplitted[0] + "-" + currLineSplitted[1]);
}
return mapper;
} finally {
if(reader != null)
reader.close();
}
}
public static void main(String[] args) throws IOException {
Multiset<String> set = getMultisetFromCSV("csv", ",");
for(String key : set.elementSet()) {
System.out.println(key + " : " + set.count(key));
}
}
公共类测试器{
公共静态多集getMultisetFromCSV(字符串csvFileName,字符串lineDelimiter)引发IOException{
Multiset mapper=TreeMultiset.create();
BufferedReader reader=null;
试一试{
reader=newbufferedreader(newfilereader(csvFileName));
字符串[]currLineSplitted;
while(reader.ready()){
currLineSplitted=reader.readLine().split(lineDelimiter);
add(currLineSplitted[0]+“-”+currLineSplitted[1]);
}
返回映射器;
}最后{
if(读卡器!=null)
reader.close();
}
}
公共静态void main(字符串[]args)引发IOException{
Multiset set=getMultisetFromCSV(“csv”,“,”);
for(字符串键:set.elementSet()){
System.out.println(key+”:“+set.count(key));
}
}
}
通过这种方式,您可以非常轻松地构建地图。之后,对于每个键,您可以使用计数键来计算与之关联的项数。在您的情况下,如果您不想将所有数据存储在内存中,我会这样做:
public class Tester {
public static Multiset<String> getMultisetFromCSV(String csvFileName, String lineDelimiter) throws IOException {
Multiset<String> mapper = TreeMultiset.create();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(csvFileName));
String[] currLineSplitted;
while(reader.ready()) {
currLineSplitted = reader.readLine().split(lineDelimiter);
mapper.add(currLineSplitted[0] + "-" + currLineSplitted[1]);
}
return mapper;
} finally {
if(reader != null)
reader.close();
}
}
public static void main(String[] args) throws IOException {
Multiset<String> set = getMultisetFromCSV("csv", ",");
for(String key : set.elementSet()) {
System.out.println(key + " : " + set.count(key));
}
}
公共类测试器{
公共静态多集getMultisetFromCSV(字符串csvFileName,字符串lineDelimiter)引发IOException{
Multiset mapper=TreeMultiset.create();
BufferedReader reader=null;
试一试{
reader=newbufferedreader(newfilereader(csvFileName));
字符串[]currLineSplitted;
while(reader.ready()){
currLineSplitted=reader.readLine().split(lineDelimiter);
add(currLineSplitted[0]+“-”+currLineSplitted[1]);
}
返回映射器;
}最后{
if(读卡器!=null)
reader.close();
}
}
公共静态void main(字符串[]args)引发IOException{
Multiset set=getMultisetFromCSV(“csv”,“,”);
for(字符串键:set.elementSet()){
System.out.println(key+”:“+set.count(key));
}
}
}
通过这种方式,您可以非常轻松地构建地图。之后,对于每个键,您可以使用计数键来计算与之关联的项数。在您的情况下,如果您不想将所有数据存储在内存中,我会这样做:
public class Tester {
public static Multiset<String> getMultisetFromCSV(String csvFileName, String lineDelimiter) throws IOException {
Multiset<String> mapper = TreeMultiset.create();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(csvFileName));
String[] currLineSplitted;
while(reader.ready()) {
currLineSplitted = reader.readLine().split(lineDelimiter);
mapper.add(currLineSplitted[0] + "-" + currLineSplitted[1]);
}
return mapper;
} finally {
if(reader != null)
reader.close();
}
}
public static void main(String[] args) throws IOException {
Multiset<String> set = getMultisetFromCSV("csv", ",");
for(String key : set.elementSet()) {
System.out.println(key + " : " + set.count(key));
}
}
公共类测试器{
公共静态多集getMultisetFromCSV(字符串csvFileName,字符串lineDelimiter)引发IOException{
Multiset mapper=TreeMultiset.create();
BufferedReader reader=null;
试一试{