Извлекать конкретную информацию из длинного списка с помощью Perl - PullRequest
1 голос
/ 14 мая 2010

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

Итак, данные выглядят следующим образом:

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: John Doe
name: ##userName

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: Jane Doe Jr
name: ##userName

DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
DataDataDataDataDataDataDataDataDataDataDataDataDataDataDataData
displayName: Ted Doe
name: ##userName

Формат, в который мне нужно экспортировать:

firstName lastName userName
firstName lastName userName
firstName lastName userName

Где пробелы являются вкладками, чтобы я мог импортировать этот файл в базу данных. У меня есть опыт работы с этим в VBScript, но я пытаюсь перейти на использование Perl для максимально возможного администрирования сервера.

Я не уверен в синтаксисе того, что я хочу, который в основном

while not endoffile{
detect "displayName: " & $firstName & " " & $lastName
detect "name: ##" & $userName

write $firstName tab $lastName tab $userName to file
}

Также, если бы кто-то мог указать мне на ресурс, посвященный синтаксическому синтаксическому анализу текста, который использует Perl, я был бы очень благодарен. Большинство ресурсов, с которыми я столкнулся, не очень помогли.

Кроме того, некоторые имена пользователей являются числами. Первые два числа все еще необходимо обрезать, но имя пользователя всегда должно содержать 6 символов, если это помогает.

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

Что-то вроде этого должно сработать - он читает из stdin и выводит в stdout, так что вы можете использовать обычные каналы Unix для использования файлов:

#!/usr/bin/perl

use strict;
use warnings;
use String::Util 'trim';

# set "line ending" to \n\n, to allow slurping by paragraphs:
local $/ = "\n\n";

while (my $line = <>)
{
    chomp $line;

    my ($displayName) = ($line =~ /^displayName: (.+)$/m);
    my ($name) = ($line =~ /^name: ##(.+)$/m);
    trim $displayName;
    trim $name;

    my ($firstName, $lastName) = ($displayName =~ /^([^ ]+) (.+)$/);

    print "$firstName\t$lastName\t$name\n";
}

Я проверил это, используя приведенный ниже пример ввода, как test.pl < input.txt, и получил вывод:

John    Doe     userName
Jane    Doe     userName
Ted     Doe     userName

Вы можете прочитать о slurping в режиме абзаца в perldoc perlvar в разделе $ / или в этом вопросе SO (ссылка необходима). Сопоставление в нескольких строках включено с флагом m в операторе сопоставления - см. perldoc perlre .

0 голосов
/ 14 мая 2010

Это мое решение.

use strict;
use warnings;
my $fh;
my $file_contents;
my @info;
open $fh, '<', "data" or die($!);
local $/ = undef;
$file_contents = <$fh>;

while($file_contents =~ /.ame: (.*?)$(.*?).ame: (.*?)$/smg)
{

   my $displayname = $1;
   my $username = $3;
   $displayname =~ s/^\s+//; #clean off any whitespace from front/back
   $displayname =~ s/\s+$//;
   my ($firstname, $lastname) = split(/\s+/, $displayname); #split on whitespace

   print "$firstname\t$lastname\t$username\n"; #note the tabs
}
...