Textdateien (bzw. Bestandteile davon) in eine Datei packen

Bash, Shell, PHP, Python, Perl, CGI
gerd
Posts: 12
Joined: 2003-01-28 20:26

Textdateien (bzw. Bestandteile davon) in eine Datei packen

Post by gerd »

Hallo,
mein Problem, in einem Verzeichnis sind viele Dateien zu einer Datei zusammenzufassen. Beispiel des simplen Befehls:
cat A.txt >> alles.txt
cat B.txt >> alles.txt
usw.
Ich habe versucht, mit meinen mageren Linux-Kenntnissen ein Shell-Script zu erstellen, dass die Zeilen nacheinander mit vielen Dateien verarbeitet. Aber leider sind meine Kenntnisse hierfür zu mager. Habt Ihr einen einfachen Lösungsansatz?
Im Idealfall soll nur ein jeweils bestimmter (per gleichbleibenden Anfangs- und Ende-String definierbarer) Teil aus den Dateien A.txt, B.txt usw. in die Datei alles.txt übernommen werden. Aber dies heißt wohl nach den Sternen greifen. Eine derartige definierbare Lösung in Perl oder PHP wäre mir allerdings auch 20EUR wert.
Danke
gerd
dea
Posts: 532
Joined: 2002-08-13 12:05

Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen

Post by dea »

gib' nicht zu viel Geld aus ;)

Shell simpel:

Code: Select all

for datei in $(ls ${verzeichnis}) do
  cat ${datei} >> ${ausgabedatei}
done
Damit hast Du alle Dateien in eine Ausgabedatei ${ausgabedatei} hineingepumpt, solltest allerdings darauf achten, dass sich die Ausgabedatei in einerm anderen Verzeichnis befindet weil Du sonst in eine Endlosschleife gerätst.

Damit hast Du übrigens auch schon das Grundgerüst für Perl und PHP :D

Jetzt müsste nur noch Deine Anforderung nach der Ausgabe von Teilen der Datei eingebaut werden - hast Du eine Beispieldatei wo man sehen könnte, wie der Text aufgebaut ist?

Zwischenzeitlich kannst Du Dich ja auch mal mit dem awk auseinandersetzen ... *g*
gerd
Posts: 12
Joined: 2003-01-28 20:26

Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen

Post by gerd »

Doch. Wenn ich eine automatisierte Lösung bekomme, soll das Dankeschön auch fließen. Ich muss allerdings gestehen. Ich brauche nicht nur abstrakt den Hinweis, sondern den vollständigen Code. So habe ich mit der Umsetzung des abstrakten Hinweises zu deiner "Shell simpel" noch echte Probleme. So weiß ich nicht, ob bei verzeichnis und ausgabedatei der gesamte Pfad .../web1/html/... genommen werden muss und ob ich irgendetwas für datei einstellen muss. Sorry, meine Kenntnisse sind sehr mager. Nur leichte Trial&Error-Perl-Kenntnisse.

Zur Ausgabe von Teilen der Datei:
Die Dateien sind recht groß (mehrere Bildschirmseiten) aber die "Trennstrings" stehen fest und sind nur einmalig vorhanden. Es soll alles herausgenommen ab:

Beginn:
<tr class=color
bis
Ende:
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>

D.h. nimm aus den Dateien eines Verzeichnisses ab
<tr class=color
einschließlich des Beginn-Strings "<tr class=color" die folgenden Zeilen, bis zu dem Ende-String
<font face="Verdana, Arial, Helvetica, sans-serif" size="2"> </font></td>

Der Ende-String sollte möglichst nicht in die "alles.txt" eingestellt werden. Wäre aber auch kein Problem, weil ich dann einfach diesen String durch nichts ersetzen würde.

Bei Bedarf stelle ich aber eine oder mehrere Beispielsdateien online.
Danke einstweilen.
rob
Posts: 82
Joined: 2002-06-03 21:53
Location: Brandenburg

Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen

Post by rob »

Code: Select all

#!/usr/bin/perl -w
#
# merge.pl - Script zum Zusammenfassen von Dateiabschnitten ein eine Datei hinein
#
# R.Schulze, 21.4.2003

use strict;

my $OUTFILE="alles.txt";

my $REC_START="<!--START-->";
my $REC_END="<!--END-->";

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

opendir(DIR,"./") || die ("Konnte das Verzeichnis nicht oeffnen");

while(my $Entry=readdir(DIR))
         {
         next if (($Entry=~m/^(.{1,2})$/) || (!-f "./$Entry") || ($Entry eq "merge.pl"));
         next if ($Entry eq $OUTFILE);

         print "> Datei "$Entry" wird bearbeitet... ";
         if(!-r "./$Entry")
                 {
                 print "Datei nicht lesbar.n";
                 next;
                 }
         my $Extract=&ExtractFromFile("./$Entry");
         if($Extract)
                 {
                 &AppendToIndex($Extract);
                 }
         print "n";
         }

exit(0);


###############################################################################
# ExtractFromFile
# extrahiert aus einen bestimmten Teil aus einer Datei
###############################################################################

sub ExtractFromFile
{
my $Filename=shift;
local $/;
open(FH,$Filename);
flock(FH,1);
my $Content=<FH>;
close(FH);

if($Content=~m/$REC_START((?:(?!$REC_END).)*)$REC_END/s)
         {
         print "[Extrakt gefunden]";
         return $1;
         }
return;
}

###############################################################################
# AppendToIndex
# fuegt einen String ans Ende einer Sammeldatei an
###############################################################################

sub AppendToIndex
{
my $Str=shift;
open(FH,">>$OUTFILE") || die ("Konnte die Datei "$OUTFILE" nicht zum Anhaengen oeffnen.");
flock(FH,2);
print FH $Str;
close(FH);
print "[An Index "$OUTFILE" gehaengt]";
return 1;
}
Einstellbar sind die Marken in den Konstanten $REC_START und $REC_END.

Die Ausgabedatei ist in der Konstanten $OUTFILE einstellbar.

Viel Spaß :)
dea
Posts: 532
Joined: 2002-08-13 12:05

Re: Textdateien (bzw. Bestandteile davon) in eine Datei packen

Post by dea »

Jau - die Perl-chen, die können das :)

Perl ist genau die richtige Sprache für sowas, weil sie (ursprünglich) auf genau solche Aufgaben gemünzt war :) Ich pers. hätte das jetzt mit dem sed veranstaltet (geht auch, ist dann aber nicht mehr so gut lesbar wie das Perl-Skript) aber wen rob so schnell ist ... :)

Ein Anmerkung noch:
Dir fallen bestimmt die Default-Werte für $REC_START und $REC_END auf, wenn es Dir möglich ist, würde ich Dir wärmstens an's Herz legen, zukünftig solche einfachen und eindeutigen Zeichenketten zur Markierung zu verwenden. Damit machst Du Dir auch später das Leben einfacher (Orientierung im Code, Suchen/Ersetzen, etc.).