Сортировать один столбец данных в файле csv в порядке возрастания в java

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    
}
}

Привет, я пытаюсь прочитать несортированный файл и заставить Java отсортировать один столбец файла данных csv и распечатать эти результаты в новом файле. Я позаимствовал это решение, когда искал на этом веб-сайте, потому что я думаю, что оно идеально подходит для того, что я пытаюсь сделать. У меня есть 282 строки данных в виде

UserID, Module, Mark

Ab004ui, g46PRo, 54

cb004ui, g46GRo, 94

gy004ui, g46GRo, 12

ab004ui, g46PRo, 34

это в файле csv. когда я использую приведенный выше код, он дает мне только одну строку в sorted_marks.txt, например

ab004ui, g46PRo, 34

и я считаю, что это даже не отсортировано.

Я хочу, чтобы все результаты из нового файла были отсортированы на основе их идентификатора пользователя и ничего больше, но я не могу заставить его работать, пожалуйста, любая помощь будет благодарна


person Izzy    schedule 12.12.2009    source источник
comment
Будьте осторожны, если вы используете Карту, если у вас есть повторяющиеся ключи, они будут перезаписаны, и вы их потеряете.   -  person True Soft    schedule 12.12.2009
comment
вместо использования карты, что вы предлагаете использовать? Я только что заметил, что не все данные сейчас там, так как многие из идентификаторов пользователей одинаковы и поэтому были перезаписаны. Какой идиот :(. Блин. как бы мне исправить это?   -  person Izzy    schedule 12.12.2009
comment
Я сделал это так: (может быть это не лучшее решение) Я все же использовал карту, НО когда я помещаю в нее объекты, я проверяю, существует ли уже ключ (вызов containsKey(key)), если он уже есть, я вызываю containsKey(key+"_001"), containsKey(key+"_002") ... в блоке while. Когда я не нахожу такого ключа, я звоню put(key+"_003", value). Вместо _ вы можете использовать пробел или символ, которого, как вы знаете, не будет ни в одном идентификаторе пользователя. Этот метод может быть не оптимальным, особенно когда у вас много данных, но, по крайней мере, он работает.   -  person True Soft    schedule 12.12.2009
comment
Другое решение — использовать Multimap коллекций Google.   -  person True Soft    schedule 12.12.2009
comment
Я только что попробовал это, потому что я думал в том же духе, но по какой-то причине, когда я реализую свой файл data1.csv, это не имеет значения, я думаю, это из-за нумерации и буквенного обозначения пользователя. Могу ли я отправить вам файл данных, чтобы вы могли понять, что я имею в виду?   -  person Izzy    schedule 12.12.2009
comment
Я никогда раньше не использовал мультикарту, сложно ли это реализовать? Я думаю, что могу просто немного усложнить эту проблему. Я могу сортировать обычные массивы, без проблем, но чтение файла данных и сортировка, а затем создание нового файла действительно меня запутали.   -  person Izzy    schedule 12.12.2009
comment
Я не понимаю, в чем проблема. На моей странице пользователя вы найдете мой сайт. Там перейдите на страницу контактов, вы найдете адрес электронной почты.   -  person True Soft    schedule 12.12.2009
comment
Спасибо, почитаю по теме. Я отправил вам письмо по поводу файла данных. Это кажется достаточно простым, многие часы, проведенные за просмотром экрана, заставили меня забыть обо всем, лол, еще раз спасибо   -  person Izzy    schedule 12.12.2009


Ответы (2)


Удалите новые строки из data1.csv.

Я бы предпочел использовать вторую общую строку карты в виде списка строк, и все почти так же, как показано ниже.

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
    }
}
person DKSRathore    schedule 12.12.2009
comment
Большое спасибо за это, я отметил это как ответ, я действительно собираюсь немного почитать карты, так как это очень интересный способ решить эту проблему. Теперь все, что мне нужно сделать, это превратить это в метод, и я готов. Еще раз спасибо за вашу помощь и объяснения - person Izzy; 12.12.2009

Вероятно, вам нужен line.split(",")[0], а не пробел. Но вы также должны обрезать пробелы в начале и в конце вашего ключа сортировки, используя соответствующую строковую функцию.

person Francis Upton IV    schedule 12.12.2009
comment
да, это работает, но по какой-то причине он сделал большой блок результатов, например: Ab004ui, g46PRo, 54, cb004ui, g46GRo, 94. а не каждый результат по отдельным линиям. поэтому он должен вернуть его как: ab004ui, g46PRo, 34 cd004ui, G46PRo, 29 - person Izzy; 12.12.2009
comment
Возможно, вы захотите повторно опубликовать свой код. Размещенный код, похоже, записывает новую строку в конце каждой строки. Проверьте, что это все еще там. - person Francis Upton IV; 12.12.2009
comment
Я отредактировал свой исходный пост и добавил то, что вы предложили, запятую. но не строковую функцию trim(), так как я продолжаю получать ошибку. Я думаю, что я не добавляю это прямо в код. Кроме того, Map перезаписывает идентификатор пользователя того же типа, что раздражает, можно ли как-то помешать ему это сделать? - person Izzy; 12.12.2009