Столбец «По значениям» CSV Java - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть CSV-файл, сформированный из двух атрибутов: первый из типа string и второй из типа double.

Начиная с этого CSV-файла, я хотел бы получить еще один, но все более упорядоченный в зависимости от значения второго атрибута. В SQL была функция ORDER BY, которая позволяла упорядочивать базу данных на основе указанного атрибута, я хотел бы получить тот же результат, что и ORDER BY.

Пример входного файла CSV:

tricolor;14.0
career;9.0
salty;1020.0
looks;208.0
bought;110.0

Ожидаемый выходной файл CSV:

career;9.0
tricolor;14.0
bought;110.0
looks;208.0
salty;1020.0

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Считайте файл CSV в List из Object[] (по одному Object[] на строку в вашем файле CSV)

  • Первым элементом массива является сама строка (строка)
  • Вторым элементом массива является значение типа double (a Double)

Итак, у вас есть следующий список:

{ 
  ["tricolor;14.0", 14.0], 
  ["career;9.0", 9.0], 
  ["salty;1020.0", 1020.0],
  ["looks;208.0", 208.0],
  ["bought;110.0", 110.0]
}

Затем сортируйте его по значению двойного

И затем вы можете записать его обратно в файл CSV (записывая только первый элемент каждого массива)

List<Object[]> list = readFile("myFile.csv");
list.sort(Comparator.comparing(p -> (Double)p[1]));
// write to csv file, just printing it out here
list.forEach(p -> System.out.println(p[0]));

Способ чтения файла:

private static List<Object[]> readFile(String fileName) {
    List<Object[]> list = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
        String line;
        String[] splitLine;

        while ((line = br.readLine()) != null) {
            splitLine = line.split(";");
            // add an array, first element is the line itself, second element is the double value
            list.add(new Object[] {line, Double.valueOf(splitLine[1])});
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return list;
}

РЕДАКТИРОВАТЬ Если вы хотите изменить порядок:

Получив отсортированный список, вы можете изменить его, используя удобный метод reverse в классе Collections

Collections.reverse(list);
0 голосов
/ 17 апреля 2019

получить значения через запятую в LinkedHashMap

TreeMap<String, Double> map = new LinkedHashMap<String, Double>();

try (BufferedReader br = Files.newBufferedReader(Paths.get("yourfile.csv"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(";");
        map.put(parts[0], Double.parseDouble(parts[1]));
    }
}
catch (IOException e) {
    System.err.format("IOException: %s%n", e);
}

, а затем отсортировать map на основе двойных значений.

попробовать с Java 8,

LinkedHashMap<String, Double> sortedMap;
sortedMap = map.entrySet().stream().sorted(Entry.comparingByValue()).collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
0 голосов
/ 17 апреля 2019

Мы можем попробовать общий подход к разбору файла в отсортированную карту (например, TreeMap), затем выполнить итерацию карты и записать обратно в файл.

TreeMap<String, Double> map = new TreeMap<String, Double>();

try (BufferedReader br = Files.newBufferedReader(Paths.get("yourfile.csv"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(";");
        map.put(parts[0], Double.parseDouble(parts[1]));
    }
}
catch (IOException e) {
    System.err.format("IOException: %s%n", e);
}

// now write the map to file, sorted ascending in alphabetical order

try (FileWriter writer = new FileWriter("yourfileout.csv");
    BufferedWriter bw = new BufferedWriter(writer)) {

    for (Map.Entry<String, Double> entry : map.entrySet()) {
        bw.write(entry.getKey() + ";" + entry.getValue());
    }
}
catch (IOException e) {
    System.err.format("IOException: %s%n", e);
}

Примечания:

  • Я предполагаю, что строковые значения в первом столбце всегда будут уникальными.Если бы могли быть дубликаты, вышеприведенный скрипт пришлось бы модифицировать, чтобы использовать карту списков или что-то в этом духе.
  • Я также предполагаю, что все строковые значения будут строчными.Если нет, то вы можете не получить ожидаемую сортировку.Одним из решений, если это будет проблемой, будет строчная (или прописная) каждая строка перед вставкой этого ключа в карту.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...