Thread Reguläre Ausdrücke suchen (34 answers)
Opened by Bionerd at 2012-04-18 12:19

topeg
 2012-04-19 13:49
#157649 #157649
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also hier noch eine Ausgabe als Matrix:
more (11.8kb):
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
# Ausgabedatei der Zusammenfassung (csv):
my $sum_out='zusammenfassung.csv';
# das gehört zu den anderen Definitionen am Anfang

#... code ...

# Zusammenfassung
#printf ("%s+%s %u\n",split(/-!-/,$_),$anzahl{$_}) for (sort keys(%anzahl));

# ab hier neuer Code:

# Ziel:
# eine Matrix der Gezählten Kombinationen
# der in den Dateien enthaltenen Ausdrücken

# Liste aller gefundenen Ausdrücke
# und die Postion, die sie in der Matrix einnehmen sollen
my %positions;
my @muster;
for my $pair (sort keys(%anzahl))
{
  for(split(/-!-/,$pair))
  {
    # wenn der Ausdruck schon eine Postion hat, dann überspringen
    next if exists $positions{$_};

    # Dem Ausdruck eine Position in der zukünftigen Matrix zuweisen
    push(@muster,$_);
    $positions{$_}=$#muster;
  }
}

# die Matrix erstellen
my @matrix;
for my $pair (keys(%anzahl))
{
  my ($m1,$m2)=split(/-!-/,$pair);
  my $count=$anzahl{$pair};

  # die Position in der Matrix ermitteln
  my $pos1=$positions{$m1};
  my $pos2=$positions{$m2};

  # Wert in die Matrix schreiben
  $matrix[$pos1][$pos2]+=$count;
}


# die Ausgabe als CSV:
# Einträge mit ";" getrennt, Zeilenenden sind "\n";
open(my $fh, '>', $sum_out) or die("ERROR open $sum_out ($!)\n");
# Zeilen/Spalten beschreiben:
print $fh 'Muster;',join(';',@muster)."\n";

# matrix durchgehen:
for my $pos1 (0..$#muster)
{
  # Wenn eine Kombination nicht existiert, den Wert auf 0 setzen
  for my $pos2 (0..$#muster)
  {
    $matrix[$pos1][$pos2]=0 unless($matrix[$pos1][$pos2]);
  }
  # Muster angeben:
  print $fh $muster[$pos1].";";

  # die Ausgabe erzeugen
  print $fh join(';',@{$matrix[$pos1]})."\n";
}
close($fh);


Zuerst gehe ich alle Gefundenen Werte durch und setze ihre Stelle in der Ausgabematrix.
danach erstelle ich die Matrix. Da ist %positions nützlich. Es enthält die Positionen der Werte in der Spalte/Zeile (Quadratische Matrix).
Bei der Ausgabe ist die Erste Zeile und Erste Spalte die gefunden Werte.
Manche Kombinationen existieren nicht und werden auf 0 gesetzt, ansonsten käme es zu einer "undef" Warnung.

View full thread Reguläre Ausdrücke suchen