Есть ли способ обрабатывать данные из текстового файла, содержащего основные заголовки, с помощью регулярного выражения? - PullRequest
1 голос
/ 18 июня 2020

Ниже приведен фрагмент структуры формата текстового файла:

Historical Sales for: 12th of October  2019, 11:37 am

PRODUCT NAME      QUANTITY
Coke B            5

Historical Sales for: 21st of October  2019, 8:15 pm

PRODUCT NAME      QUANTITY
Peanuts           2

Я хочу обрабатывать только метки столбцов и значения строк, но не включая основной заголовок, в данном случае Исторические продажи за: 12 октября 2019 г., 11:37 .

Это код, который я написал для обработки текста с помощью регулярного выражения (\\b)

        StringBuilder temporary = new StringBuilder();
   
        InputStream inputStream = new FileInputStream(new File(FILE_NAME));            
        BufferedReader readFile = new BufferedReader(new InputStreamReader(inputStream));
        
        String next; 
        
        while ((next = readFile.readLine()) != null) {
           temporary.append(next).append("\n");
        }   

        next = String.format("%13s", ""); // spacing for column headers          
        System.out.println(temporary.toString().replaceAll("(\\b)", next));

1 Ответ

2 голосов
/ 19 июня 2020

Если вы собираетесь напечатать только строки:

PRODUCT NAME      QUANTITY
Chips             2
Coke B            5

And similares. Я предлагаю вам использовать потоки Java 8 и использовать приведенное ниже регулярное выражение для удаления нежелательных строк:

public static void main(String[] args) throws Exception {
    String collect = Files.lines(Paths.get("file.txt"))
            .filter(line -> !line.matches("^Historical Sales for.*$") && !line.matches("^\\s*$"))
            .map(line -> line+="\n")
            .collect(Collectors.joining());
    System.out.println(collect);
}

Таким образом вы получите:

PRODUCT NAME      QUANTITY
Chips             2
Coke B            5
PRODUCT NAME      QUANTITY
(...)

Одно из преимуществ использования потоков это метод .collect(), который позволяет вам анализировать строку непосредственно в List.

Если вы хотите сохранить свой пример, вы можете сделать:

StringBuilder temporaryData = new StringBuilder();

InputStream inputStream = new FileInputStream(new File("file.txt"));
BufferedReader readFile = new BufferedReader(new InputStreamReader(inputStream));

String next;

while ((next = readFile.readLine()) != null) {
    temporaryData.append(next).append("\n");
}

next = String.format("%13s", ""); // spacing for column headers
String formattedString = temporaryData.toString().replaceAll("(\\b{3})", next);
String stringWithoutHeaders = formattedString.replaceAll("^Historical Sales for.*$", "").replaceAll("^\\s*$", "");
System.out.println(stringWithoutHeaders);
...