Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Hallo zusammen, ich habe ein Textfile vorliegen (1.4 GB), in welchem alle möglichen Infos zu ~7800000 Dateien drinstehen, unter anderem auch die Dateiendung. Nun möchte ich eine Übersicht über die Dateiendungen erhalten, á la: EXE: 200000 DAT: 123455 HTML: 1234444 . . . Wie kann ich das bewerkstelligen? Gruß, Moritz
Datum: 07.11.2005-09:37

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Wie ist die Datei aufgebaut?
Datum: 07.11.2005-11:39

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Ich bin schon soweit, dass ich die Datei zeilenweise durchgehe und die Endung in jedem Durchgang in eine Variable schreibe. Nun ist die Frage, wie ich dann weitermache: #!/usr/bin/perl open(DAT, "<alles.txt") || die "Datei nicht gefunden\n"; while(<DAT>) { my @array = split(/ /, $_); $typ = @array[1]; } close(DAT); In $typ steht die Endung.
Datum: 07.11.2005-12:04

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
Hm, kennst du File::Basename? Da kannst du mittels fileparse schön komfortabel die Dateiendungen auslesen. Zum Speichern deiner Ergebnisse würde ich dir Config::General oder DB_SDBM empfehlen. Die Module sind leicht zu handhaben und bei letzterem kannst du sogar deine Ergebnisse gemütlich in einen Hash schreiben.
Datum: 07.11.2005-19:00

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Hi, auch Dir vielen Dank für deine Antwort, leider stehe ich erst in den Anfängen von Perl, ich habe das nur für die Auswertung dieses Textfiles gebraucht und dabei wird es wohl auch vorerst bleiben. Normal scripte ich immer mit VBS, aber das ist im Vergleich so stinkelahm^^. Deswegen kann ich nicht soviel mit deiner Antwort anfangen, aber trotzdem vielen Dank für deine Mühe! Grüße, Moritz
Datum: 08.11.2005-16:24

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
OK, hier ist ein Schnipselchen zum Speichern in eine Datei mit DB_SDBM:
my $anzahl_exedateien = 10; my $db = 'c:/verz/file.db'; my %h = (); # Hash als Datenbank verwenden (so in etwa) tie(%h, 'SDBM_File', $db, O_RDWR|O_CREAT, 0666) or die "Couldn't tie SDBM file '$db': $!; aborting"; my %copy = %h; % eine Kopie der DB anlegen, falls du später ncoh was damit machen willst. %h wird später wieder geleert $h{"exe"} = $anzahl_exedateien; # Die Anzahl der exe-Dateien wird jetzt in die Datei geschrieben. Später kannst du mit $h{"exe"} wieder darauf zugreifen. untie %h; # Datanbank schließen (sozusagen) # %h ist jetzt leer
So legst du dir eine kleine DB an, mit der du komfortabel arbeiten kannst. Du hast nämlich Zugriff auf die DB indem du einfach auf %h zugreifst. Damit kannst du schnell deine Daten speichern und auch wieder auslesen. In der Dokumenation zum Modul findest du weitere Beispiele. Und jetzt noch zu File::Basename:
use FIle::Basename qw(fileparse); # nimm die Methode fileparse aus dem Modul my @endungen = qw(.exe .pl .vbs .png); my ($name,$path,$endung) = fileparse($fullname,@endungen);
Der Vorteil bei Modulen ist halt, dass du nicht alles selber coden musst (z.B. open(DAT...), sondern vorgefertigte Codestücke die i.d.R. auch gut, robust und performant sind benutzen kannst. Und wenn du später mal ein ähnliches Programm brauchst kannst du die Sachen auch schneller aus deinen bisherigen Codes herleiten, weil die Grundfunktionalität gar nicht von dir selber stammt sondern immer exakt gleich im Modul vorliegt. Bei weiteren Fragen einfach hier posten.
Datum: 08.11.2005-17:43

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| kannst Du ein paar Zeilen des großen files posten, ansonsten können wir Dir leider nicht richtig helfen. Aber ein Tip: sowas macht man mit nem Hash. Gruss, svenXY
Datum: 07.11.2005-11:42

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Ich bin schon soweit, dass ich die Datei zeilenweise durchgehe und die Endung in jedem Durchgang in eine Variable schreibe. Nun ist die Frage, wie ich dann weitermache: #!/usr/bin/perl open(DAT, "<alles.txt") || die "Datei nicht gefunden\n"; while(<DAT>) { my @array = split(/ /, $_); $typ = @array[1]; } close(DAT); In $typ steht die Endung.
Datum: 07.11.2005-12:04

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
#!/usr/bin/perl -wuse strict; # immer gut! my %types; # hash fr die Endungen open(DAT, "<alles.txt") || die "Datei nicht gefunden\n"; while(<DAT>){ my @array = split(/ /, $_); $typ = @array[1]; $types{$typ}++; # Der Typ ist der Index im assotiativen Array, die Anzahl ist der Wert und der wird einfach jedesmal um 1 hochgezhlt } close(DAT); ### Ausgabe: foreach my $suffix (sort keys %types) { print "$suffix kommt $types{$suffix} mal vor\n"; }
gruss, svenXY
Datum: 07.11.2005-12:27

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
und noch ein kleiner Fehler: die Zeile muss
my $typ = $array[1];
heissen. Auf Array Elemente greift man mittels $array[...] zu, nicht mit @array[...] - ein gern gemachter Fehler.Wenn Du use strict; und use warnings; benutzt, wird Perl Dir das freundlicherweise mitteilen. Hilft ungemein.
Datum: 07.11.2005-12:41

|
re: Auswertung Testfile mit Dateiendungen
|
Seitenanfang |
| Fein, vielen Dank für die schnelle Hilfe, hat sehr geholfen! Grüße, Moritz
Datum: 07.11.2005-12:58

|