Thread zwei Arrays vergleichen und doppelten Inhalt löschen (31 answers)
Opened by Matze2.pl at 2014-11-13 10:27

Matze2.pl
 2014-11-13 14:41
#178336 #178336
User since
2014-10-30
23 Artikel
BenutzerIn
[default_avatar]
Ich habe es versucht so übersichtlich wie nur möglich zu gestalten.
Hier nun meine überarbeitete Version:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/usr/bin/perl -w

use strict;
use warnings;
use POSIX;
use utf8;
use File::Find;


my ($datei);
my (@files);
my ($txtdatein);
my ($mumpitz);
my ($inhalttxt);
my ($files);
my ($loesch);
my @loesch;
my ($alter);
my ($kurzalter);
my ($txtdatei);
my @pfad = glob "*.txt";
my $dir= "/var/lib/testverzeichnis/k_loesch/k_transport/";
my $verzeichnis = "/var/lib/testverzeichnis/k_loesch";
my $mydate = &datum_zeit("D.M.J");


find(\&wanted,$dir) ;

sub wanted
{
  my $file = $File::Find::name;
#schreibt alle echten Datein in @files
  push (@files,$file) if(-f $file); 
}

opendir(DIR, $verzeichnis);
#packt alle pfade die auf eine textdatei zeigen in @txtdatein
my @txtdatein = grep{ $_ =~ /\.txt$/ }readdir(DIR);     
closedir DIR;

foreach $txtdatein (@txtdatein)
{
  #öffnet diese textdateien
  open (TXT,"<$txtdatein");
#und packt den inhalt in @alletxtdatein 
    my @alletxtdatein = <TXT>;                                  
  close (TXT);
  foreach $inhalttxt (@alletxtdatein)
  {
    open (INHALTOUT,">>inhalt_aller_txt_datein.txt");
#schreibt den Inhalt aller textdatein in eine textdatei
      print INHALTOUT "$inhalttxt";                     
    close (INHALTOUT);
  }
}

open (INHALTIN,"<inhalt_aller_txt_datein.txt"); 
#liest den inhalt in ein array  
  my @inhlattxt = <INHALTIN>;
close (INHALTIN);

my %h = map { $_ => 1 } @inhlattxt;
#vergleicht beide arrays und löscht in @files alles was in @inhalttxt (inhalt aller txtdatein) schon steht
@files = grep { ! exists $h{$_} } @files;
 
open (ZWEITE,">>$mydate.txt");
#schreibt neuen inhalt in $mydate.txt (der Name dient nur der Übersichtlichkeit
  print ZWEITE "@files";                                                
close (ZWEITE);

foreach $txtdatei (@pfad)
{
  $alter = -M "$txtdatei";                                               
  $kurzalter = sprintf "%.0f",$alter;
  if ($kurzalter > 14)                                                  #wenn die erstellte txtdatei älter als 14 tage ist
  {
    open (LOESCH,"<$txtdatei");                                 
#wird der inhalt eingelesen 
      @loesch = <LOESCH>;
    close (LOESCH);
    foreach $loesch (@loesch)
    {
      print "$loesch\n";
      unlink "$loesch"; #und dann gelöscht
    }
    unlink ("$txtdatei");
  }
}


## Die sub ist nicht sooo wichtig sah nur schön aus mit dem datum!!

sub datum_zeit
{

        my $p=$_[0];
        my %DATUM_ZEIT;
        my $timeparameter;
        my ($Sekunden, $Minuten, $Stunden, $Monatstag, $Monat, $Jahr, $Wochentag, $Jahrestag, $Sommerzeit) = localtime(time);
        $Monat+=1;
        $Jahrestag+=1;
        $Monat = $Monat < 10 ? $Monat = "0".$Monat : $Monat;
        $Monatstag = $Monatstag < 10 ? $Monatstag = "0".$Monatstag : $Monatstag;
        $Stunden = $Stunden < 10 ? $Stunden = "0".$Stunden : $Stunden;
        $Minuten = $Minuten < 10 ? $Minuten = "0".$Minuten : $Minuten;
        $Sekunden = $Sekunden < 10 ? $Sekunden = "0".$Sekunden : $Sekunden;
        $Jahr+=1900;
        
        $DATUM_ZEIT{'J'}=$Jahr;
        $DATUM_ZEIT{'M'}=$Monat;
        $DATUM_ZEIT{'D'}=$Monatstag;
        $DATUM_ZEIT{'h'}=$Stunden;
        $DATUM_ZEIT{'m'}=$Minuten;
        $DATUM_ZEIT{'s'}=$Sekunden;
        $DATUM_ZEIT{'T'}=$Wochentag;

        if ($p)
        {
                $p=~s/(J|M|D|h|m|s|T)/$DATUM_ZEIT{$1}/g, while ($p=~/J|M|D|h|m|s|T/);
        }
        else
        {
                $p=$Jahr.$Monat.$Monatstag.'_'.$Stunden.$Minuten.$ Sekunden;
        }
        return $p;
}
unlink ("inhalt_aller_txt_datein.txt");


SO ich hoffe das ihr das besser lesen könnt :)

Es sollen also alle datein in dem verzeichnis in eine TXT-Datei geschrieben werden. Am nächsten Tag sollen alle NEUEN Dateien in diesem Verzeichnis in eine Neue TXT-Datei geschrieben werden.
Nur klappt das bei mir nicht :/
ich habe das probiert:
Code (perl): (dl )
1
2
my %h = map { $_ => 1 } @inhlattxt;
@files = grep { ! exists $h{$_} } @files;

mit zwei array die nur jeweils 3 pfad beinhalteten und davon 1 unterschiedlich war. Da hat es geklappt, aber wenn ich das jetzt so mache wie oben im skript steht funktioniert es nicht.
Da schreibt er mir dann in die neue TXT-Datei das was in der alten war + das was neu ist.
hat jemand einen lösungsvorschlag dafür?
Last edited: 2014-11-13 14:51:22 +0100 (CET)

View full thread zwei Arrays vergleichen und doppelten Inhalt löschen