Schrift
[thread]11370[/thread]

Mehrere Dateien in eine einzige einfügen

Leser: 2


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
alonso
 2008-02-26 22:34
#106385 #106385
User since
2008-02-26
1 Artikel
BenutzerIn
[default_avatar]
Hallo ich habe mehrere Dateien "001234.txt" "002002.txt" "049638.txt"
Diese beinhalten folgende Werte

Hier das Beispiel fuer "001234.txt" (die beiden anderen sehen ähnlich aus)
Code: (dl )
001234#aaa@bbb.de ccc@ddd.de eee@fff.de

Wie kann man alle drei in eine einzige einlesen ?
Das Problem ist, dass ich noch gar nicht weiss, wie die zu erwartenden Dateien heissen.
Das einzige was ich genau weiss ist, dass die Endung .txt ist und vor dem Punkt zu 99,9% eine 6-stellige Zahl steht.

Diese, die dann daraus erzeugt wird, wird dann mit einem Script in mysql importiert.
MisterL
 2008-02-26 23:49
#106393 #106393
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Dateien öffnen geht so: http://wiki.perl-community.de/bin/view/Wissensbasi...
Anschliessend wird die Zeildatei kreiert, in die die Inhalte dann jeweils mittels append-Befehl ans Ende eingefügt werden.

Gruss MisterL
“Perl is the only language that looks the same before and after RSA encryption.”
renee
 2008-02-27 09:54
#106407 #106407
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
alonso+2008-02-26 21:34:39--
Das Problem ist, dass ich noch gar nicht weiss, wie die zu erwartenden Dateien heissen.
Das einzige was ich genau weiss ist, dass die Endung .txt ist und vor dem Punkt zu 99,9% eine 6-stellige Zahl steht.


Und woher soll dann das Skript wissen, welche Dateien zusammengefügt werden sollen?
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/
SimplyFred
 2008-02-27 10:14
#106408 #106408
User since
2006-12-16
25 Artikel
BenutzerIn
[default_avatar]
Ja, genau das ist ja das Problem.
Ich muss wohl doch den Vorschlag machen, alle relevante Daten in eine einzige Datei (z.B. input.txt) zu schreiben.
Code: (dl )
1
2
3
001234#aaa@bbb.de,ccc@ddd.de,eee@fff.de
002002#peter@petra.de,bernhard@bianca.de
049638#bibi@blocksberg.com


Dann wäre das wesentlich einfacher ...
renee
 2008-02-27 10:42
#106412 #106412
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wenn es eine "feste Regel" gibt, wie die Dateien bestimmt werden können, dann kann man das auch im Skript machen. (Wie machst Du - als Mensch - das?)

Das einfachste wäre natürlich das Programm, dass die Dateien erzeugt, dazu zu bringen alles in eine einzige Datei zu schreiben.
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/
MisterL
 2008-02-27 11:04
#106413 #106413
User since
2006-07-05
334 Artikel
BenutzerIn
[default_avatar]
Eigentlich sieht die Sache ganz einfach aus:
man liest alle Dateinamen eines Verzeichnisses aus Rezept im Kochbuch
man prüft mittels Regex, welche Dateinamen auf .txt enden und mit einer sechsstelligen Zahl beginnen. Diese Dateinamen werden in ein neues Array eingelesen, danach geht es mit dem Öffnen der Dateien, dem Auslesen der Inhalte und dem Schreiben derselben in die neue Datei weiter
“Perl is the only language that looks the same before and after RSA encryption.”
renee
 2008-02-27 11:15
#106415 #106415
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
MisterL+2008-02-27 10:04:42--
man prüft mittels Regex, welche Dateinamen auf .txt enden und mit einer sechsstelligen Zahl beginnen.


Genau da liegt das Problem:
alonso
Das einzige was ich genau weiss ist, dass die Endung .txt ist und vor dem Punkt zu 99,9% eine 6-stellige Zahl steht.


Mit deinem Ansatz kann es passieren, dass Du eine Datei nicht erfasst. Oder vielleicht sind andere Dateien so benannt, dass der Ausdruck matcht aber eigentlich soll die Datei nicht mit berücksichtigt werden.

Deswegen habe ich geschrieben, wenn es eine "feste Regel" gibt, lässt sich das auch im Programm lösen.
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/
tecker
 2008-02-27 11:49
#106417 #106417
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wenn es zu 99,99% mit 6 Ziffern beginnt und auf .txt endet könntest du es wie oben schon erwähnt über einen Regex machen, wie z.B. "^([\d]{6,}).txt"

Könnte in etwa so aus sehen:
... funktioniert zumindest :)


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
#!/usr/bin/perl -w

use strict;
use warnings;

my $file = "output.dat";

opendir(DIR, ".");
my @filelist = readdir(DIR);

foreach (@filelist)
{

if ($_ =~ /^([\d]{6,}).txt/)
{

open(FILE,">>$file");
open(TXT,"<$_");
foreach my $line (<TXT>) {print FILE "$line";}
}
close(FILE);
close(TXT);
}
renee
 2008-02-27 11:55
#106418 #106418
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@tecker: Ein paar Anmerkungen:

Da sollten mehr Fehlerbehandlungen rein:

* opendir( DIR, "." ) or die $!;
* open(FILE,">>$file") or die $!;
* ...

Warum liest Du erst alles in ein Array ein und iterierst dann darüber?

Code: (dl )
1
2
3
4
5
6
opendir DIR, '.' or die $!;
while( my $entry = readdir DIR ){
if( ... ){
}
}
...


if ($_ =~ /^([\d]{6,}).txt/) hier sind sowohl die eckigen als auch die runden Klammern unnötig. Außerdem sollte der Punkt maskiert werden, weil sonst auch "1234567txt" gefunden werden würde. Das {6,} sagt "6 oder mehr". Hier wurde gesagt, dass es wohl genau(!) 6 Zahlen sind, also einfach das "," weglassen. Und es sollte noch der Anker am Ende verwendet werden, sonst würde auch "1234567txttxttxttxt" matchen.

Also if ($_ =~ /^\d{6}\.txt$/)
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/
tecker
 2008-02-27 12:15
#106421 #106421
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Stimmt ... unnötig alles erst in ein Array zu lesen. Was ich nur immer an denen toll finde. Naja man lernt ja nie aus :)

Regex war also doch nicht ganz korrekt, danke für Verbesserung!

Achja und Fehlerbehandlung gehört natürlich noch mit dazu.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2008-02-26 22:34.