Schrift
[thread]7221[/thread]

Alle *.txt Dateien in eine packen: zusammenführen der Daten

Leser: 1


<< >> 8 Einträge, 1 Seite
ahnungsloser
 2005-08-19 13:53
#57302 #57302
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich hab da mal so ein Problem. Wir haben ein Verzeichnis, darin befinden sich ca. 500 Textdateien, die sollen alle bzw. deren Inhalte, in eine einzige Textdatei eingespeichert werden.
Code: (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
$aktverz    = $ARGV[0];     #aktuelles Verzeichnis
$ausgabedat = $ARGV[1]; #Ausgabe Datei

# Verzeichnis öffnen und Dateien nacheinander einlesen

if (chdir $aktverz) {
@alledateien = <*.txt>; #alle Textdateien im Verzeichnis ermitteln
}
else {
print "Konnte das Verzeichnis nicht finden!\n";
}

# Alle gefundenen Dateien öffnen
open (OUT, ">$ausgabedat") || die "Kann Datei nicht anlegen!"; # Ausgabe Datei erstallen

foreach $data (@alledateien) {
open (IN, "$data") || die "kann die Dateien nicht öfnnen"; #Dateien öffnen
@alles = <IN>;
}

foreach $data2 (@alles) {
print OUT $data2; #in Datei schreiben
}

close (IN);
close (OUT);

so hab ich mir gedahct, könnte ich das Problem lösen, es wird aber nur der Inhalt, der letzten Datei geschrieben, es sieht so aus als würden die vorherigen nicht berücksichtigt?

Könnt ihr mir ein Tipp geben?
vayu
 2005-08-19 14:18
#57303 #57303
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
foreach $data (@alledateien) {
open (IN, "$data") || die "kann die Dateien nicht öfnnen"; #Dateien öffnen
@alles = <IN>;
}


hier wird bei jedem schleifendurchlauf das array wieder neu angelegt und somit die alten daten überschrieben.

ich würd gleich die grad geöffnete datei in die OUT rüberschreiben.

btw close IN mit in die forschleife nehmen, wo du die Datei auch öffnest.


Code: (dl )
1
2
3
4
5
6
7
8
foreach $data (@alledateien) {
open (IN, "$data") || die "kann die Dateien nicht öfnnen"; #Dateien öffnen
while(<IN>) {
print OUT $_;
}
close IN;
}
close OUT;
\n\n

<!--EDIT|vayu|1124447155-->
renee
 2005-08-19 14:23
#57304 #57304
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;

my ($dir,$file) = @ARGV;

system('cat $dir/*.txt > $file');
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
vayu
 2005-08-19 14:25
#57305 #57305
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
sooo gehts natürlich auch -.-
Strat
 2005-08-19 14:45
#57306 #57306
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
wenn du @alles = <IN> schreibst, wird @alles geleert und der inhalt der aktuellen datei hinzugefuegt. entweder schreibst du es gleich in der foreach $data-Schleife nach OUT, oder du verwendest anstelle von @alles = <IN> das konstrukt push(@alles, <IN>); aber das kostet bei groesseren dateien unnoetig RAM.

teste mal:
Code: (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
#! /usr/bin/perl
use warnings;
use strict;

my $aktVerz = $ARGV[0] or &PrintUsage();
my $ausgabedat = $ARGV[1] or &PrintUsage();

unless (opendir(DIR, $aktVerz)) {
die "Error: couldn't open dir '$aktVerz': $!\n";
} # unless

unless (open (OUT, ">", $ausgabedat)) {
die "Error: couldn't write to '$ausgabedat': $!\n";
} # unless

while (my $file = readdir(DIR)) {
my $fileName = "$aktVerz/$file";
next if -d $filename; # ueberspringe verzeichnisse
next unless $file =~ /\.txt$/; # ueberspringe nicht-txt

unless (open(FILE, "<", $filename)) {
warn "Error: couldn't open file '$filename': $!\n"; # oder die ...
} # unless
else {
print OUT $_ while <FILE>;
close (FILE);
} # else
} # while

closedir(DIR);
close(OUT);
# --------------------------------------------
sub PrintUsage {
require File::Basename;
my $bin = File::Basename::basename($0);
die "Usage: $bin verzeichnis ausgabedatei\n";
} # PrintUsage
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Taulmarill
 2005-08-19 15:23
#57307 #57307
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
just my two cents:

das script von Strat erfüllt natürlich die anforderungen und ist sauber programmiert. allerdings würde ich mich renee anschliessen bzw. noch einen schrit weiter gehen und sagen, dass man das ganz ohne perl lösen sollte. unix hat nun einmal sehr mächtige werkzeuge, und man sollte idealerweise immer das benutzen, welches die aufgabe am besten erfüllt.

allerdings kann es natürlich auch sein, dass:
1. die ganze sache systemunabhängig funktionieren soll
2. das ganze keine ernst gemeinte anwendung ist, sondern nur ein übung darstellt
3. man auf einem hackerfeindlichen system arbeitet (windows)
in diesem fall würde ich natürlich Strats lösung bevorzugen.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ahnungsloser
 2005-08-19 16:26
#57308 #57308
User since
2003-09-03
80 Artikel
BenutzerIn
[default_avatar]
So,

erstma vielen Dank! Da sind ja viele sehr gute Anregungen dabei!
Es sollte erstma eine schnelle Lösung sein, zu alle dem auch noch Windoof funktionierend.....

Code: (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
###############################################################################

### PerlScript um *.txt Dateien zu einer zusammen zu f&¸hren ###

### Script by: H. Appel ###

### Datum: 19.08.2005 Version 0.01 ###

###############################################################################



$aktverz = $ARGV[0]; #aktuelles Verzeichnis

$ausgabedat = $ARGV[1]; #Ausgabe Datei



# Verzeichnis &ˆffnen und Dateien nacheinander einlesen



if (chdir $aktverz) {

@alledateien = <*.txt>; #alle Textdateien im Verzeichnis ermitteln

}

else {

print "Konnte das Verzeichnis nicht finden!\n";

}



# Alle gefundenen Dateien &ˆffnen

open (OUT, ">>$ausgabedat") || die "Kann Datei nicht anlegen!"; # Ausgabe Datei erstallen



foreach $data (@alledateien) {

open (IN, "$data") || die "kann die Dateien nicht &ˆfnnen"; #Dateien &ˆffnen

foreach $hm (<IN>){

print OUT $hm;

close (IN);

}

}

close (OUT);

So hats wohl auch gefunzt!
renee
 2005-08-19 16:29
#57309 #57309
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Noch ein paar Hinweise:

Du benutzt $aktverz nur einmal. Könnte man rausnehmen...
Du solltest Dir auch mal Wiki:use strict; anschauen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< >> 8 Einträge, 1 Seite



View all threads created 2005-08-19 13:53.