Текстовый файл - многострочная строка в одну строку - PullRequest
0 голосов
/ 03 февраля 2019

Я анализирую текстовый файл и выполняю некоторые задачи редактирования.Я застрял при изменении многострочной строки в одну строку.

Рабочий процесс: 1) объединить несколько строк в одну строку 2) извлечь определенные строки, которые содержат некоторые символы или запуски *

уже пробовал некоторыеметоды, но без желаемых результатов.

цель состоит в том, чтобы иметь эту строку:

Jrn.Directive "WindowSize"  , "[A.rvt]", "Floor Plan: Level 1" , 1912, 849

на основе

 Jrn.Directive "WindowSize"  _
         , "[A.rvt]", "Floor Plan: Level 1" _
         , 1912, 849

пробовал:

line.lines().collect(Collectors.joining("_"+"[\n]"));

или

line.replaceAll("  _\n" +
                        "         ,");

Ценится за любые рекомендации Обновление:

Рабочий процесс:

  1. текст содержит следующий текст (это небольшая часть всего текстового файла) - Я не смог вставить его как код, пожалуйста, смотрите скриншот

    Jrn. Директива "WindowSize" _, "[A.rvt]", "План этажа: Уровень 1" _, 1912, 849 '0: <.Marshalling '0: <... CompactCaching = 1 (Enabled)' 0: <.ThreadPool '0: <... ActivePoolSize = 51' 0: <... ConfiguredPoolSize = automatic '0: <...ParallelCores = 8 '0: <... RequestedPoolSize = automatic' 0: <.Tuning '0: <... ElemTable = 1 (последовательный, кроме многопоточных)' 0: <BC: 0,0,0 Jrn.Directive "WindowSize "_," [A.rvt] "," План этажа: Уровень 1 "_, 1912, 84 </p>

Пожалуйста, смотрите скриншот https://i.ibb.co/0cRrwcR/2019-02-03-1947.png

Поскольку я буду извлекать строки, которые начинаются с Jrn.D и т. Д. Мне нужно присоединиться к этому и получить

Jrn.Directive "WindowSize", "[A.rvt]"," План этажа: Уровень 1 ", 1912, 849

Я думаю, что сначала необходимо определить, какие строки необходимо объединить, затем я могу извлечь строки, которые содержат интересную информацию, например, напримерони начинаются с Jrn.D.

Код, который я использую, чтобы найти конкретные строки

import java.io.*;
import java.util.stream.Collectors;
public class ReadFromFile {
    public static void main(String [] args) {
        // The name of the file to open.
        String fileName = "test.txt";

        // This will reference one line at a time
        String line = null;

        try {
            // FileReader reads text files in the default encoding.
            FileReader fileReader =
                    new FileReader(fileName);

            // Always wrap FileReader in BufferedReader.
            BufferedReader bufferedReader =
                    new BufferedReader(fileReader);

            while((line = bufferedReader.readLine()) != null) {

            // Im defining which lines are important for me but firstly I 
            //need have them in one line especially when looking for Jrn
                if (line.startsWith("Jrn")|| 
                line.contains("started recording journal file")|| 
                line.contains("' Build:")|| line.contains("Dim Jrn"))
                System.out.println(line);
            }
            // Always close files.
            bufferedReader.close();
        }
        catch(FileNotFoundException ex) {
            System.out.println(
                    "Unable to open file '" +
                            fileName + "'");
        }
        catch(IOException ex) {
            System.out.println(
                    "Error reading file '"
                            + fileName + "'");
            // Or we could just do this:
            // ex.printStackTrace();
        }

    }
}

1 Ответ

0 голосов
/ 04 февраля 2019

Лучший (наименее навязчивый для файла) способ, который я могу решить для вашей конкретной проблемы, - это добавить разделитель (*) в конце мета-информации Jrn.Directive, если она находится в пределах возможной области, например:

Jrn.Directive "WindowSize" _ , "[A.rvt]", "Floor Plan: Level 1" _ , 1912, 849*

Затем вы можете использовать цикл для последовательной печати каждого токена, который не соответствует разделителю, и прерывать цикл, когда это происходит.

Примерно так

    //File object instantiation
    File file = new File("test.txt");

    //Iterator which loops over every line in the file
    Iterator<String> iterator = Files.readAllLines(file.toPath()).iterator();

    //The end delimiter for you Jrn.Directive information
    String delimiter = "*";

    while(iterator.hasNext()) {
            //String to store current line
            String line = iterator.next();
            //Execute if line starts with Jrn.Directive
            if (line.startsWith("Jrn")) {
                //JrnLoop to serialize Jrn.Directive information
                JrnLoop: while(true) {
                    //Splitting and processing each character in the current line
                    for(String token: line.split("")) {
                        //Escape and break the JrnLoop if the current character matches end delimiter
                        if (token.matches(delimiter)) {
                            System.out.println();
                            break JrnLoop;
                        }
                        //Otherwise print the current character
                        System.out.print(token);
                    }
                    //Go to the next line of the Jrn.Directive information
                    line = iterator.next();
                }
            }
            //If the line does not start with Jrn.Directive
            else {
                System.out.println(line);

        }

Относительно того, почему ваша Jrn.Directive информация хранится в файле в несколько строк, я действительно не знаю,

...