User since
2005-10-08
31
Artikel
BenutzerIn
Hallo zusammen,
ich habe eine Datei mit zeilenorientierten Datensätzen, aus denen ich eine bestimmte Anzahl Datensätze im Querschnitt extrahieren möchte. Die Restmenge möchte ich natürlich auch bestimmen.
Z. B. habe ich eine Datei mit 6000 Zeilen, von denen ich 4000 im Querschnitt herausziehen und in Datei A schreiben möchte, die restlichen 2000 will ich dann in Datei B haben.
Oder auch 2000 in Datei A, 2000 in Datei B, 2000 in Datei C usw...
Jetzt ist das Lesen und schreiben selber kein Problem, aber ich bin kein Mathematiker und habe Probleme mit dem Querschnitt an sich.
Etwas wie "Math::CrossSection" scheint es (noch?) nicht zu geben, zumindest finde ich nichts darüber (falls "CrossSection" überhaupt die richtige Übersetzung ist )
Kennt jemand ein Modul ( oder eine Funktion) , mit dem etwas ähnliches möglich ist?
Grüße
AndreasM
User since
2003-08-14
2022
Artikel
BenutzerIn
Wenn ich ehrlich bin, ist mir völlig unklar was du mit "im Querschnitt herausziehen" meinst?! Wie sehen denn die Daten in den Zeilen aus? Nach was soll gefiltert werden?
User since
2005-10-08
31
Artikel
BenutzerIn
Es soll gar nichts gefiltert werden.
Es sind einfache Zeilen in einer Datei.
In meinem konkreten Fall: Kundenadressen. Eine Liste von 9768 Adressen (eine Adresse pro Zeile), bereits nach Postleitzahl sortiert.
3555 davon sollen in die eine Datei, der Rest in eine andere Datei.
Würde ich einfach die ersten 3555 Adressen in die eine Datei schreiben und den Rest in eine andere bekäme ich aber keinen repräsentativen Querschnitt, sondern hätte irgendwan einen harten Schnitt. Das will ich aber nicht.
Es soll, wenn möglich, aus jedem Bundesland mal einer in der einen oder anderen Datei landen.
Das meine ich mit "repräsentativem Querschnitt".
Grüße
AndreasM
User since
2003-08-14
2022
Artikel
BenutzerIn
AndreasM+2007-09-21 20:10:20--Es soll gar nichts gefiltert werden.
Naja, wenn du
n aus
m benötigst, ist das eine Auswahl - die nach einem Kriterium erfolgen muss. Du könntest dafür die Wahrscheinlichkeit verwenden. Bei deinem Beispiel wäre die Wahrscheinlichkeit ob ein Datensatz relevant ist oder nicht 3555/9768. Vereinfacht könnte sowas so ähnlich aussehen (mit ein paar Pferdefüssen):
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
use strict;
use warnings;
my $max = 6;
my $lines = 20;
my $prob = $max / $lines;
my $cnt = 0;
while(<DATA>) {
last if $cnt > $max;
(rand(1) <= $prob) and $cnt++ and print;
}
print "last one was on line: " . $.;
__DATA__
foo
bar
buz
qiz
quz
foo
bar
buz
qiz
quz
foo
bar
buz
qiz
quz
foo
bar
buz
qiz
quz
EDIT: Es gibt übrigens einen signifikanten Unterschied zwischen einem "repräsentativen Querschnitt" und dem Querschnitt - bei letzterem gehen die meisten Leute von einer Fläche aus.
User since
2005-10-08
31
Artikel
BenutzerIn
Ich sehe das ganze als Mengenproblem.
Es geht nicht nur um n aus m, sondern ggf. auch um
a aus n
b aus n
(c aus n)
...
wobei gelten muss :
a nicht in b
( b nicht in c UND a nicht in c)
usw usw....
Ich brauche wohl ein Mengenlehrenbuch ;)
Kennt denn jemand den korrekten englischen Begriff dadür? Das könnte mir beim Suchen helfen.
CrossSection ist wohl eher eine bildliche Schnittdarstellung.
Grüße
AndreasM
User since
2005-10-08
31
Artikel
BenutzerIn
Hm,
einen Algorithmus habe ich zwar (noch) nicht gefunden, aber ich benutze jetzt
Algorithm::Numerical::Shuffle
Damit mische ich die Liste mit meinen Zeilennummern durch und zähle dann einfach von oben ab (sooft ich will oder bis es nix mehr zu zählen gibt).
Es funktioniert und sieht auch vom Ergebnis her, äh, repräsentativ aus.
Grüße und Danke
AndreasM
User since
2006-02-17
628
Artikel
BenutzerIn
suchst Verteilung bzw. Häufigkeit?
http://de.wikipedia.org/wiki/H%C3%A4ufigkeitsverte...
Das liesse sich einfach über einen HASH lösen