处理.CSV文件并将listarrays排序为多个listarrays? - JAVA

时间:2014-01-14 23:58:13

标签: java

所以我试图在CSV中对大量数据进行排序。文件。该文件包含公司的一定数量的信息,但有1000多家公司。例如,我可能需要通过1000家公司,能够获得他们的年度收入,当前股票价值,CEO等等。每家公司将提供相同的信息(相同数量的逗号但不同的字符长度),但是该文件是CSV。公司名称和信息均以逗号分隔。

目前我正在通过信息之间的逗号将csv文件拆分为数组。但我希望能够将这些信息与公司保持在一起,并能够根据给定的信息和公司名称进行指定,调用和排序。但是因为我已经通过逗号分隔了这些信息,所有这些信息已经列在了listarray中。

那么是否可以在大规模上指定每15个逗号(或listarray中的分裂)应该重新连接在一起?这样,listarray的每个部分都是一个独立的公司。或者是否有另一种方法来分离数据,以便信息不被分割?

注意:csv文件中没有相似之处可以让我分割信息,以便在每个公司信息之后拆分。

这里是一个csv文件的样本。

"Tiffany & Co. Com",964270,"+0.81","1/14/2014",88.97,93.64,"87.795 - 88.97""Asia Pacific Fund",20700,"+0.04","1/14/2014",10.23,11.37,"10.19 - 10.23""Anadarko Petroleu",4236380,"+2.47","1/14/2014",80.99,98.47,"78.40 - 80.99""Proto Labs, Inc. ",451984,"-0.18","1/14/2014",73.83,89.97,"71.00 - 73.83""Zuoan Fashion Lim",201560,"-0.02","1/14/2014",1.79,3.62,"1.71 - 1.79"

3 个答案:

答案 0 :(得分:0)

public class Read{

 String original = "";
 String company = "";
 String otherValue = "";

public Read(String read){

  //here Split the original string into the values 

}

//public void getters and setters

}

然后创建一个读取对象数组并根据需要对它们进行排序

答案 1 :(得分:0)

一个想法是将CSV解析为对象,然后对这些对象进行排序。该对象将“知道”它由CSV组成的字段数以及如何解析每个字段。使用StringTokenizer进行解析并使用TreeMap进行排序将类似于:

    ...
    BufferedReader reader = new BufferedReader(new FileReader("somedata.csv"));
    TreeMap<String, MyObject> map = new TreeMap<>();
    String line = reader.readLine();
    StringTokenizer tokens = new StringTokenizer(line,",");
    while(tokens.hasMoreTokens()) {
        MyObject obj = new MyObject(tokens);
        //add the objects to the sorted map, where field1 is what we sort on
        map.put(obj.field1, obj);
    }
    ...
}

static class MyObject {
    //would need the same number of fields as you want to group
    String field1;
    String field2;
    //... so with 2 fields, input is field1,field2,field1,field2,...

    MyObject (StringTokenizer input) {
        this.field1 = input.nextToken();
        this.field2 = input.nextToken();
    }
}

答案 2 :(得分:0)

我同意将每行CSV转换为Java对象。 但传统的解析机制对我来说太冗长了,我可能需要处理太多条件,例如引号之间的逗号,带有多行描述的列中的换行符。所以我建议你使用像supercsv这样现有的超棒解决方案。

我还为它编写了一个包装器,以方便开发人员。

QuickOCM会让你这样做。

  1. 创建公司类

     public class Company {
    
         /* this specifies that 
          * it is a mandatory field in the csv, 
          * of header name "Company Name" and 
          * of type string. 
          * Header is the first line of the csv.
          */
         @ImportField(mandatory = true, name = "Company Name", type = "String")
         public String name;
    
         @ImportField(mandatory = true, name = "Name of the CEO", type = "String")
         public String ceoName;    
     }
    

    您需要公共getter-setter或公共字段,任何工作

  2. 创建csv解析器,处理每一行的处理程序,可能添加到要排序的列表,然后调用解析

    final List<Company> companies = new ArrayList<Company>();
    
    csvParser.process(inputStream, Company.class, new RecordHandler<Company>() {
        @Override
        public void execute(Company imported, int rowNumber, Map supplementaryInfo) {
            companies.add(imported);
        }
    });
    
  3. 现在,您可以使用排序列表实现对列表进行排序,也可以使用比较器。

  4. 有关详细信息,您可以查看QuickOCM page