【问题标题】:Dealing with .CSV files and sorting a listarrays into multiple listarrays? - JAVA处理 .CSV 文件并将列表数组排序为多个列表数组? - 爪哇
【发布时间】:2014-01-14 23:58:13
【问题描述】:

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

目前我正在通过信息之间的逗号将 csv 文件拆分为一个数组。但我希望能够将信息与公司一起保存,并能够指定、调用并按给定的信息和公司名称排序。但是因为我已经通过逗号分隔了信息,所以它已经在 listarray 中列出了。

那么是否可以大规模指定每 15 个逗号(或列表数组中的拆分)应重新连接在一起?这样,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"

【问题讨论】:

  • 发布样本数据。听起来您需要两个循环来填充二维数组。一个外循环遍历所有数据(所有公司),一个内循环用 15 条数据填充数组。
  • 您可以使用分割线的第一个索引作为Map中的键,然后为剩余数据保留一个信息对象列表(假设公司名称是第一个索引)每行)。
  • 如果这不是你需要自己编写的学校练习,请考虑使用诸如 opencsv 之类的库。它不仅可以让您的任务更轻松,还可以处理您可能没有想到的事情,例如转义逗号(例如,如果公司名称是“Foo, Inc.”)。
  • 这个问题表明了对 Java 是一种面向 Object 的语言这一点的根本误解。使用库将您的数据读入Company 对象的集合,然后按照您的意愿使用它们。您甚至可以将它们存储到数据库中并进行查询。
  • 我是面向对象语言 boris 的新手。我试图将信息放入公司对象中,它只是将数据分开以便能够将其放入对象中。看起来 dana 建议了一个可能很好的库来执行此操作。

标签: java


【解决方案1】:

我同意将 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解析器,处理每一行的handler,可能添加到列表中排序,然后调用parse

    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. 现在您可以使用排序列表实现对列表进行排序,也可以使用比较器。

详细信息,您可以查看QuickOCM page

【讨论】:

    【解决方案2】:
    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
    
    }
    

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

    【讨论】:

      【解决方案3】:

      一个想法是将 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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 1970-01-01
        • 2015-07-02
        • 2016-09-23
        • 2020-07-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多