2014-01-14 37 views
0

所以我想通過CSV中的大量數據進行排序。文件。該文件包含一系列公司信息,但有1000多家公司。例如,我可能需要經歷1000家公司,能夠獲得他們的年收入,現有股票價值,CEO等等。每家公司都會提供相同的信息(逗號數量不同但字符長度不同),但是作爲該文件是一個CSV文件。公司名稱和信息全部用逗號分隔。處理.CSV文件並將listarrays分類爲多個listarrays? - JAVA

當前我通過信息之間的逗號將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" 
+0

發佈樣本數據。這聽起來像你需要兩個循環填充一個2維數組。一個外部循環遍歷所有數據(所有公司),以及一個用15個數據填充數組的內部循環。 – woodlumhoodlum

+0

您可以使用分割線的第一個索引作爲[Map](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html)中的鍵,然後保留剩餘數據的信息對象列表(假定公司名稱是每行的第一個索引)。 – mdl

+1

如果這不是一個需要自己編寫的學校練習,請考慮使用opencsv之類的庫。它不僅可以讓你的工作更輕鬆,而且還可以處理你可能沒有想到的事情,例如逃脫的逗號(例如,如果公司名稱是「Foo,Inc.」)。 – Dana

回答

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制定者或公共領域,任何工作

  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. Now you ca n通過使用排序列表實現對列表進行排序,或使用相同的比較器。

有關詳細信息,您可以查看QuickOCM page

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 

} 

然後,讓閱讀對象的數組,只要你想

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(); 
    } 
}