Как добавить содержимое 2 текстовых файлов в java - PullRequest
1 голос
/ 29 апреля 2020

Итак, у меня есть 2 текстовых файла с наборами информации, содержащей имена и цифры, есть ли способ разделить цифры и добавить цифры, сохраняя имена в новом файле? Спасибо

Первый файл выглядит так

john-100
james-12
carlos-392

Второй файл выглядит так

john-4
james-38
carlos-8

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

john-104
james-50
carlos-400

Ответы [ 2 ]

2 голосов
/ 29 апреля 2020

Я думаю, определенно есть способ сделать это. Но кажется неправильным писать код для вас, поэтому я просто опишу алгоритм, и вам нужно его реализовать.

Так что вы можете сначала использовать https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#readAllLines - java .nio.file.Path- для чтения строк из файла.

Затем вы можете разбить каждую строку на - и поместить результат в Map<String, Integer, используя https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#compute -K - java .util.function.BiFunction-

Затем просто выполните итерации по элементам карты и создайте еще одну List<String> той же структуры с '% name% -% number% `.

И, наконец, используйте https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#write - java .nio.file.Path- java .lang.Iterable- java .nio.charset.Charset- java .nio.file. OpenOption ...- , чтобы записать List<String> в новый файл.

0 голосов
/ 29 апреля 2020

В приведенном ниже коде используется java stream API . Код создает поток строк из каждого файла. Он читает первый файл и создает Map, где ключ карты - это имя, которое отображается в файле, а значение карты - это число (которое отображается в файле рядом с именем). Затем он читает второй файл и объединяет данные во втором файле в существующую карту.

РЕДАКТИРОВАТЬ

В исходном коде (ниже) я забыл обработать часть, в которой вы хотите записать полученную карту в файл. Я добавил это под комментарием Added in edit. Я создаю List строк из карты и записываю этот список в новый файл.

/* Required imports:
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
 */
Path path1st = Paths.get("path-to-first-file");
Path path2nd = Paths.get("path-to-second-file");
Function<String, String> keyMapper = str -> {
    String key = null;
    if (str != null  &&  str.indexOf('-') >= 0) {
        String[] parts = str.split("-");
        if (parts.length == 2) {
            key = parts[0];
        }
    }
    return key;
};
Function<String, Integer> valueMapper = str -> {
    Integer value = null;
    if (str != null  &&  str.indexOf('-') >= 0) {
        String[] parts = str.split("-");
        if (parts.length == 2) {
            try {
                value = Integer.valueOf(parts[1]);
            }
            catch (NumberFormatException x) {
                // Ignore. 
            }
        }
    }
    return value == null ? Integer.valueOf(0) : value;
};
BinaryOperator<Integer> mergeFunction = (first, second) -> {
    int one = first == null ? 0 : first.intValue();
    int two = second == null ? 0 : second.intValue();
    return Integer.valueOf(one + two);
};
try {
    Map<String, Integer> theMap = Files.lines(path1st)
                                       .collect(Collectors.toMap(keyMapper, valueMapper));
    Map<String, Integer> totals = Files.lines(path2nd)
                                       .collect(Collectors.toMap(keyMapper, valueMapper, mergeFunction, () -> theMap));
    System.out.println(totals);
// Added in edit
    List<String> lines = totals.entrySet()
                               .stream()
                               .map(entry -> String.format("%s-%s", entry.getKey(), entry.getValue()))
                               .collect(Collectors.toList());
    Files.write(Paths.get("path-to-new-file"),
                lines,
                StandardOpenOption.CREATE,
                StandardOpenOption.WRITE);
//
}
catch (IOException x) {
    x.printStackTrace();
}

Выполнение вышеуказанного кода на предоставленных вами образцах данных выводит следующее содержимое карты:

{carlos=400, james=50, john=104}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...