Как обновить текстовый файл на Java - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть текстовый файл, и я хочу обновлять каждый раз только последние 3 метки

Изменения будут сделаны через ID (1,2 и т. Д.)

стр. (для ID = 1 изменить: 10,18 / 10 / 18,7 на 12,21 / 10 / 18,2)

user.txt:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,10,18/10/18,7
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

Так что после запуска я хочу взять это как вывод:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,12,21/10/18,2
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

Код ищет идентификатор, читает и записывает данные, но как мне каждый раз заменять последние 3 метки?

Исходный код:

    @FXML 
         TextField ID3,abs,Dabs,Fabs
    @FXML
    public void UseAddAbs() throws IOException {                //Kanei Add tis Apousies sinfona me to ID
        String searchText = ID3.getText();
        Path p = Paths.get("src", "inware", "users.txt");
        Path tempFile = Files.createTempFile(p.getParent(), "usersTemp", ".txt");
        try (BufferedReader reader = Files.newBufferedReader(p);
                BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
            String line;

            // copy everything until the id is found
            while ((line = reader.readLine()) != null) {
                writer.write(line);
                if (line.contains(searchText)) {
                    writer.write("," + Fabs.getText());
                    writer.write("," + Dabs.getText());
                    writer.write("," + abs.getText());
                    break;
                }
                writer.newLine();
            }

            // copy remaining lines
            if (line != null) {
                writer.newLine();
                while ((line = reader.readLine()) != null) {
                    writer.write(line);
                    writer.newLine();
                }
            }
        }

        // copy new file & delete temporary file
        Files.copy(tempFile, p, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(tempFile);
    }

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Разбиваем строки и работаем над полями:

        while ((line = reader.readLine()) != null) {
            String[] fields = line.split("[,]");
            if (fields[0].equals(searchID)) {
                fields[12] = "12";
                fields[13] = "21/10/18";
                fields[14] = "2";
            }
            writer.println(String.join(",", fields));
        }

Обновление: мой код:

public static void main(String[] args) {
    try {
        String searchText = "1";
        Path p = Paths.get(".", "users.txt");
        Path tempFile = Files.createTempFile(p.getParent(), "usersTemp", ".txt");
        try (BufferedReader reader = Files.newBufferedReader(p);
                BufferedWriter writer = Files.newBufferedWriter(tempFile)) {
            String line;

            // copy everything until the id is found
            while ((line = reader.readLine()) != null) {
                String[] fields = line.split("[,]");
                if (searchText.equals(fields[0])) {
                    for (int i = 0; i < fields.length; ++i) {
                        System.out.println(i + ": " + fields[i]);
                    }
                    fields[12] = "12";
                    fields[13] = "21/10/18";
                    fields[14] = "2";
                }
                writer.write(String.join(",", fields));
                writer.newLine();
            }
        }

        // copy new file & delete temporary file
        Files.copy(tempFile, p, StandardCopyOption.REPLACE_EXISTING);
        Files.delete(tempFile);
    } catch (IOException ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}
0 голосов
/ 12 ноября 2018

Вы можете разбить строку на массив и обновить последние 3 элемента массива. Тогда все, что вам нужно сделать, это построить новую строку из этого массива и написать эту строку вместо старой.

Пример:.

while ((line = reader.readLine()) != null) {
    if (line.contains(searchText)) {
        String updatedLine = updateLastNStrings(line, 3);
        writer.write(updatedLine);
        break;
    } else {
        writer.write(line);
    }
    writer.newLine();
}

private String updateLastNStrings(String line, int n) {
    String [] parts = line.split(",");
    for (int i = parts.length - n; i < parts.length; i++) {
        // update String
        String newPart = parts[i] + "_UPDATED";
        parts[i] = newPart;
    }
    return String.join(",", parts);
}

Введите:

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,10,18/10/18,7
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

Результат

1,alex,pass,Admin,Alexandros,Karatzas,Male,18/10/1990,A'Likeiou,Antreas,Karatzas,6945952301,12_UPDATED,21/10/18_UPDATED,2_UPDATED
2,maria,pass1,User,Maria,Karatza,Female,18/10/1990,B'Likeiou,Antreas,Karatzas,6945952381,20,18/10/18,5

Примечание обновляется строка с _UPDATED

Примечание

Кроме того, найденный вами код некорректен, поскольку для поиска идентификатора он выполняет поиск, если строка содержит charSequence. Что если ID - это содержимое строки?

Пример: * * тысяча двадцать-пять

1,some_content,2,3
2,some_content,1

Вы пытаетесь найти строку по идентификатору 2, и первая строка будет обновлена ​​вместо второй.

...