Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将CSV文件列中的类似项分组为主键_Java_Csv - Fatal编程技术网

Java 将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 我需要以这样的方式对这些项目进行分组

我有一个大的CSV文件,数据与此类似

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;
试一试{