Сравните файлы и проверьте, не существует ли что-то, что существует в одном файле, в другом файле - PullRequest
0 голосов
/ 09 апреля 2020

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

#!/usr/bin/perl

use strict;
#use warnings;
use utf8;
use Data::Dumper;

my $usernames = 'usernames.txt';
my $permissions = 'ab1000.prm';
my $prmlogins = 'prmlogins.txt';

# Programme ausführen
clean_permissions();

# Subroutinen
# Subroutine welche die gewünschte Datei Zeile für Zeile ausgibt
sub read_lines {
    my($file) = @_;

    open my $in, "<:encoding(utf8)", $file or die "$file: $!";
    local $/ = undef;
    my $content = <$in>;
    close $in;
    return split /\n/, $content;
}

sub clean_permissions {

    my $counter = 0; # Zählervariable wird definiert
    my @adnutzer = ''; # Array für Nutzernamen wird definiert
    my @ab1000prm = read_lines('ab1000.prm'); # Zeilen des Dokuments werden eingelesen
    my @adnames = read_lines('ad_user.csv'); # Zeilen der CSV mit Subroutine in Array einlesen
    my $zeilenzaehler = 1; # Zeilenzähler wird definiert
    my $zeilen = ''; # Variable in der die Anzahl der Zahlen gespeichert werden
    my @prmnutzer = '';


    foreach(@adnames) { # Über das erstellte Array itirieren
      $counter++; # Zähler für Zeilenanzahl
      next if ($counter eq 1); # Erste Zeile überspringen
      my @tmp = split(';', $_); # Spalten am Semikolon trennen
      push(@adnutzer, uc($tmp[3])); # Vierte Spalte (Userlogins) in Array pushen
    }

    foreach(@ab1000prm) { # Über die Permissions datei itirieren
      my $wortzaehler = length($_); # Variable zum Zählen von Zeichen in einer Zeile
        $zeilen = $zeilenzaehler++; # Zeilenzähler wird der Zeilen Variable zugewiesen

      if ($wortzaehler > 255) { # Wenn eine Zeile mehr als 255 Zeichen hat:
        #print ("Zeile $zeilenzaehler behinhaltet: $wortzaehler zeichen!\n"); # Wird die Nummer der Zeile und die Anzahl and Zeichen ausgegeben
      }

    next if /^#/; # Zeilen mit '#' werden übersprungen
      my @tmp = split(":", $_); # Übrigen Zeilen werden am ':' getrennt und in temporäres Array gepackt
      @prmnutzer = split(",", $tmp[1]); # Der wichtige Teil der Zeilen wird in Array gepackt
    }

    #print("Das Dokument beinhaltet: $zeilen Zeilen!\n"); # Anzahl der Zeilen wird ausgegeben

}

Файл разрешений выглядит следующим образом:

## 
!*EDIT.FIRMA.FIR_BELEGNR_007:

## Sperrt im Einkauf das Editieren des ursp. Bestelltermins
!*EDIT.POSITIONEN.POS_TERM2:

## 
!INFOPT*ARTSTAT.AST_BSTWERT:EDV,EK,EKL,GF,KSLMITEK,VT,EKIWE,EKTEC,KSIWE,EKHOT

## SperrtdieStammdateninderArtikelverwaltung.
ART_VERW*M0805.1:

## 
!*EDIT.EINKVERBAND.EKV_X_SZBNR:KATEI,EDV,MHERGEN,CJANSSENS

## SperrteditierenvobRabattB-ArtikelimKunden
!*EDIT.KUNDEN.KDN_GRRAB_002:EDV,MGREB,JEIFERT,CJANSSENS,RWAUMANS,NWACHALL

Имена пользователей перечислены после «:», все до этого не имеет значения.

И файл активных пользователей выглядит следующим образом:

FAX800
LABDELHALIM
DABEL
LABU
UACKERMANN
DADAEM
CADLER
SADOLF
FAFF
KAGOCS
JAHLHEIM
JAIGNER
KAIZELKSNIS
NAKGUEN
DALAERTS
JALBERS
SALBERT
SALBERTSILA
FALBERTS
SALBRECHT
AALEX
MALGAC
BALLES
YALTUNTAS
SAMBERG
KAMESEDER
BAMLING
CAMLUNG
UAMSUESS
KANDERS
MANDRAE
AANDRAE
GAND
AANTO
EAPPEL
AAPPEL
AAPPELWILPEG
BAPTOULACH

Это всего лишь фрагмент, файл имеет около 2000 строк ...

А также я редактирую на ОС Ma c, если это актуально.

пс. Я действительно новичок в Perl и программировании в целом: D

1 Ответ

1 голос
/ 09 апреля 2020

Пожалуйста, смотрите следующий фрагмент кода для возможного подхода к проблеме.

чтение активных пользователей в массив и возвращение ссылки на массив

чтение разрешений пользователей в массив и возвращение ссылки на массив

создать га sh с активными пользователями

go через пользователей с правами доступа и посмотреть, является ли пользователь активным

  • , если пользователь не активен, сохранить свой идентификатор в ' users_ceased 'array

вывод содержимого' users_ceased 'на консоль

ПРИМЕЧАНИЕ:

Настройте имена файлов в соответствии с вашими настройками, данные и формат ввода сохранены из опубликованных

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $debug = 1;

my $fn_users = 'data_active_users.dat';     # File with active users
my $fn_perms = 'data_permission.dat';       # File with permissions 

my $users_act  = read_users($fn_users);     # Read active users 
my $users_perm = read_perms($fn_perms);     # Read permission users

say Dumper($users_act)  if $debug;
say Dumper($users_perm) if $debug;

my %active;
my @users_ceased;

$active{$_}++ for @{ $users_act };          # Fill hash with active users

for my $user ( @{ $users_perm } ) {
    push @users_ceased, $user if not $active{$user};
}

say '
 Ceased users
-----------------------------';
say for @users_ceased;

sub read_users {
    my $filename = shift;

    open my $fh, '<:encoding(utf8)', $filename
        or die "Couldn't open $filename";

    my @users = <$fh>;

    close $fh;

    chomp @users;

    return \@users;
}

sub read_perms {
    my $filename = shift;

    my @users;

    open my $fh, '<:encoding(utf8)', $filename
        or die "Couldn't open $filename";

    while( <$fh> ) {
        next unless /.*?:(.*)/;
        my $list = $1;
        next if not defined $list;
        my @add_users = split ',', $list;
        @users = (@users, @add_users);
    }

    close $fh;

    return \@users;
}

Ouput

 Ceased users
-----------------------------
EDV
EK
EKL
GF
KSLMITEK
VT
EKIWE
EKTEC
KSIWE
EKHOT
KATEI
EDV
MHERGEN
CJANSSENS
EDV
MGREB
JEIFERT
CJANSSENS
RWAUMANS
NWACHALL

С небольшим изменением кода

my %active;
my %users_ceased;

$active{$_}++ for @{ $users_act };          # Fill hash with active users

for my $user ( @{ $users_perm } ) {
    $users_ceased{$user}++ if not $active{$user};
}

say '
 Ceased users
-----------------------------';
for my $user ( sort keys %users_ceased ) {
    printf "%-10s => %2d time(s)\n", $user, $users_ceased{$user};
}

Вывод будет следующим

 Ceased users
-----------------------------
CJANSSENS  =>  2 time(s)
EDV        =>  3 time(s)
EK         =>  1 time(s)
EKHOT      =>  1 time(s)
EKIWE      =>  1 time(s)
EKL        =>  1 time(s)
EKTEC      =>  1 time(s)
GF         =>  1 time(s)
JEIFERT    =>  1 time(s)
KATEI      =>  1 time(s)
KSIWE      =>  1 time(s)
KSLMITEK   =>  1 time(s)
MGREB      =>  1 time(s)
MHERGEN    =>  1 time(s)
NWACHALL   =>  1 time(s)
RWAUMANS   =>  1 time(s)
VT         =>  1 time(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...