Использование Perl для разбора текста из блоков - PullRequest
2 голосов
/ 08 октября 2019

У меня есть файл с несколькими блоками теста. ДЛЯ КАЖДОГО блока теста я хочу иметь возможность извлечь то, что находится в квадратной скобке, строку, содержащую ПЕРВЫЙ экземпляр слова «площадь», и то, что находится справа от квадратной скобки. Все будет строкой. По сути, я хочу сохранить каждую строку в переменной в хэше, чтобы я мог распечатать ее в CSV-файле с 3 столбцами.

Вот пример того, как выглядит файл:

Учащийся - [K-6] Исключительно в математике
/home/area/kinder/mathadvance.txt, 12
Учащиеся в классе K-12 показали себя исключительными по математике.
Помещено в специальную послешкольную программу.
См. /Home/area/overall/performance.txt, 200

Студент - [младший] Слабая успеваемость
Учащиеся с общей слабой успеваемостью.
Услуги летней программы, предлагаемые, как показано в
"/home/area/services/summer.txt", 212

Студент- [K-6] Временные интервалы физических упражнений
/ home /area / pe / schedule.txt, 303
Назначенные временные интервалы для PE в зависимости от уровня успеваемости ученика. Сделайте ссылку на
/home/area/overall/classtimes.txt, 90

Я хочу получить окончательный CSV-файл, который будет выглядеть так:

Оценка, Тема, Путь
K-6, Исключительно в математике, /home/area/kinder/mathadvance.txt, 12
K-6, Слоты времени для физических упражнений, / home / area / pe / schedule.txt, 303
Junior, Weak Performance, "/home/area/services/summer.txt", 212

Поскольку это CSV-файл, я знаю, что он также будет выделяться в строкечисло при экспорте в Excel, но я в порядке.
Я начал с того, что поместил тип оценки в массив, потому что я хочу иметь возможность добавлять в него больше строк для разных классов.

Моя программа до сих пор выглядит следующим образом:

#!/usr/bin/perl
use strict;
use warnings;

my @grades = ("K-6", "Junior", "Community-College", "PreK");

Я думал, что мне нужно будет выполнить какую-то команду system sed, чтобы взять то, что находится в скобках, и сохранить его впеременная. Затем я возьму все справа от скобки в строке и сохраню в переменной. Затем я найду строку, содержащую «область», чтобы получить путь, и сохраню ее в виде строки в переменной, помещу их в хеш и затем выведу в csv. Я не уверен, правильно ли я думаю об этом. Кроме того, у меня нет идеи, как это сделать для каждого блока текста в файле. Мне нужно это по блокам, потому что у каждого блока есть свои соответствующие оценки, темы и пути.

1 Ответ

6 голосов
/ 08 октября 2019
perl -000 -ne '($grade, $topic) = /\[(.*)\] (.*)/;
               ($path) = m{(.*/area/.*)};
               print "$grade, $topic, $path\n"' -- file.txt
  • -000 включает режим абзаца, -n не будет читать построчно, но абзац за абзацем
  • /\[(.*)\] (.*)/ соответствует квадратным скобкам, и все, что следует за нимина новую строку. Внутренние квадратные скобки и следующий текст заключены в круглые скобки.
  • m{(.*/area/.*)} захватывает строку, содержащую «область». Он использует синтаксис m{} вместо //, поэтому нам не нужно ставить обратную косую черту (избегая так называемого «синдрома наклоняющейся зубочистки»)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...