2009-12-12 76 views
1
import java.io.*; 
import java.util.*; 

public class Sort { 

public static void main(String[] args) throws Exception { 
BufferedReader reader = new BufferedReader(new FileReader("data1.csv"));   
Map<String, String> map=new TreeMap<String, String>(); 
String line=""; 
while((line=reader.readLine())!=null){     
     map.put(getField(line),line); 
     } 
     reader.close(); 
FileWriter writer = new FileWriter("sorted_numbers.txt"); 
for(String val : map.values()){ 
    writer.write(val);  
    writer.write('\n');   
     } 
     writer.close(); 
} 
private static String getField(String line) { 
    return line.split(",")[0];//extract value you want to sort on  
} 
} 

Hia的 我想讀一個未排序的文件,並獲取Java排序的CSV數據文件的一列,並在一個新的文件打印這些結果以升序在CSV文件中的一列數據。我在這個網站上搜索時借用了這個解決方案,因爲我認爲這個解決方案非常適合我想要實現的目標。我有一個282行的數據形式爲排序在Java

UserID, Module, Mark 

Ab004ui, g46PRo, 54 

cb004ui, g46GRo, 94 

gy004ui, g46GRo, 12 

ab004ui, g46PRo, 34 

這是在csv文件中。 當我用上面的代碼只讓我在sorted_marks.txt一條線,像這樣

ab004ui, g46PRo, 34 

而且我相信它甚至wasnt排序。

我希望所有來自新文件的結果,以根據自己的用戶ID,沒有別的排序,但我似乎無法得到它的工作,請任何幫助,將不勝感激

+0

要小心,如果你使用地圖,如果你有重複鍵,他們將被覆蓋,你會失去他們。 – 2009-12-12 17:38:01

+0

而不是使用地圖,你建議使用什麼?我剛剛注意到,並非所有數據都在那裏,因爲許多用戶ID都是相同的,所以已被覆蓋。什麼是白癡:(。該死的,我怎麼會糾正這個? – Izzy 2009-12-12 17:57:07

+0

我這樣做了:(也許這不是最好的解決方案)我仍然使用地圖,但是當我把對象放入它時,我檢查是否已經存在該鍵(調用'containsKey(key)')如果它已經在那裏,我在while塊中調用'containsKey(key +「_ 001」)'''containsKey(key +「_ 002」)'...當我不找到這樣一個關鍵字,我稱之爲'put(key +「_ 003」,value)'。而不是「_」,你可以使用空格或者一個你知道它不會在任何用戶標識中的字符。 ,尤其是當你有大量的數據,但至少它的工作原理 – 2009-12-12 18:18:47

回答

7

從data1.csv中刪除新行。

我寧願使用地圖的第二通用String作爲字符串列表,一切都幾乎是相同像下面

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 
import java.util.TreeMap; 

public class Sort { 
    public static void main(String[] args) throws Exception { 
     BufferedReader reader = new BufferedReader(new FileReader("data1.csv")); 
     Map<String, List<String>> map = new TreeMap<String, List<String>>(); 
     String line = reader.readLine();//read header 
     while ((line = reader.readLine()) != null) { 
      String key = getField(line); 
      List<String> l = map.get(key); 
      if (l == null) { 
       l = new LinkedList<String>(); 
       map.put(key, l); 
      } 
      l.add(line); 

     } 
     reader.close(); 
     FileWriter writer = new FileWriter("sorted_numbers.txt"); 
     writer.write("UserID, Module, Mark\n"); 
     for (List<String> list : map.values()) { 
      for (String val : list) { 
       writer.write(val); 
       writer.write("\n"); 
      } 
     } 
     writer.close(); 
    } 

    private static String getField(String line) { 
     return line.split(",")[0];// extract value you want to sort on 
    } 
} 
+0

非常感謝您的支持,我已經將此標記爲答案,我很樂意在地圖上完成一些閱讀,因爲這是完成此問題的一種非常有趣的方式。現在我所要做的就是把它變成一種方法,然後完成。再次感謝您的幫助和解釋 – Izzy 2009-12-12 18:59:41

0

你可能想行。 split(「,」)[0],而不是空格。但是,您還應該使用適當的字符串函數從排序鍵的開始和結尾修剪空格。

+0

yey可以工作,但由於某種原因,它已經使它成爲一大塊結果,像這樣:Ab004ui,g46PRo,54, cb004ui,g46GRo,94.而不是每個結果在個別行上。所以它應該返回它: ab004ui,g46PRo,34 cd004ui,G46PRo,29 – Izzy 2009-12-12 17:46:25

+0

您可能想重新發布您的代碼。發佈的代碼似乎在每行末尾都寫了一個換行符。檢查是否仍然存在。 – 2009-12-12 18:07:01

+0

我編輯了我原來的帖子,並添加了你的建議,逗號。但不修剪()字符串函數,因爲我不斷收到錯誤。我認爲我並沒有把它添加到代碼中。 Map也覆蓋了相同類型的用戶ID,這很煩人,無論如何阻止它這樣做? – Izzy 2009-12-12 18:24:14