Как заменить все дублирующие строки

Рейтинг: 0Ответов: 0Опубликовано: 31.07.2023

Не могу разобраться, как сделать так, чтобы скрипт Котлин при поиске строк заменял все найденные одинаковые строки. На данный момент скрипт делает только одну замену (допустим в файле 3 дублирующие строки, скрипт меняет только одну, а нужно чтобы заменял все найденные дублирующие строки).

Суть скрипта такая, сначала он берет текст из файла номер 1 (ищет по строкам которые начинаются с INGAME и REPORT ENGLISH), по этому тексту делает поиск в файле номер 2 (hml), когда находит такой же текст, рядом с ним будет номер, затем по этому номеру делает поиск в файле номер 3, и ниже найденного номера будет текст который скрипт копирует и вставляет вместо текста в файле номер 1.

В целом скрипт нормально справляется, но оставляет много дублирующего текста в файле номер 1 (заменяет только один дубликат, а нужно чтобы всё).

Пробовал вместо replace писать replaceAll, не помогает.

Вот код:

fun main(args: Array<String>) {
    val reader1 = File("src/main/resources/file1.txt")
        .bufferedReader()
    val inputStr1 = reader1.use(BufferedReader::readText)
    reader1.close()

    val inputSeq1 = "(?<=(INGAME|REPORT) ENGLISH:\\s).+$"
        .toRegex(RegexOption.MULTILINE)
        .findAll(inputStr1)
        .map { it.value }
        .flatMap { it.split("|") }

    val reader2 = File("src/main/resources/file2.xml")
        .bufferedReader()
    val inputStr2 = reader2.use(BufferedReader::readText)
    reader2.close()

    val inputSeq2 = "<translation_record.+/>"
        .toRegex(RegexOption.MULTILINE)
        .findAll(inputStr2)
        .map { it.value }

    val inputSeq = inputSeq1.map { subStr ->
        val regex = "[{}*]".toRegex().replace(subStr) { "\\${it.value}" }
            .toRegex(RegexOption.IGNORE_CASE)
        val line = inputSeq2.find { regex.containsMatchIn(it) }
        Pair("\\d+".toRegex().find(line ?: "")?.value?.toIntOrNull() ?: 0, subStr)
    }.filter { it.first > 0 }.sortedBy { it.first }.distinctBy { it.first }
    //println(inputSeq.map { it.first })
    val reader3 = File("src/main/resources/file3.txt")
    .bufferedReader()
    val inputStr3 = reader3.use(BufferedReader::readText)
reader3.close()

    val inputSeq3 = inputStr3.split("\\n{2,}|\\s{4,}".toRegex())
        .filter { "^STR-".toRegex(RegexOption.MULTILINE).containsMatchIn(it) }
        .map {
            val (first, second) = it.split('\n')
            Pair("\\d+".toRegex().find(first)?.value?.toIntOrNull() ?: 0, second)
        }

    val inputIter = inputSeq.iterator()
    var outputStr = inputStr1
    var old = inputIter.next()
    for (new in inputSeq3) {
        if (!inputIter.hasNext()) break
        if (new.first == old.first) {
            outputStr = outputStr.replace(old.second, new.second)
            old = inputIter.next()
        }
    }

    val writer = File("src/main/resources/file4.txt").bufferedWriter()
    writer.use { it.write(outputStr) }
    writer.close()
}

Также скрипт на последнем этапе (при вставке в файл 1) затрагивает строки, которые НЕ начинаются с INGAME и REPORT ENGLISH. Хотя должен только их менять.

Ответы

Ответов пока нет.