Thread Datei schreiben und parallel einlesen (11 answers)
Opened by gian at 2010-12-14 12:21

Gast gian
 2010-12-14 12:21
#143546 #143546
Hallo zusammen,

ich habe ein kleines Problem. Und zwar will ich gerne eine Datei einlsen die gleichzeitig von einem anderen Prozess gefüllt wird. Nun hab ich dazu ein Skript geschrieben, dass eine Datei "raw.dat" öffnet und einließt solange Zeilen forhanden sind. So weit klappt dies auch problemlos. Allerdings soll das Skript, wenn es am Ende der Datei angekommen ist warten und sobal eine neue Zeile dazu gekommen ist, diese direkt einlesen.

Unten habe ich mal mein Skript angehängt + dem Skript welches eine Sonde simuliert, die später in meinem Fall auch die Datei füllt.

Einleseskript

Code (perl): (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
#!/usr/bin/perl
#########################################################
## Version Test Erstellt: 14.12.2010 Verfasser: Bremm
#########################################################

use DBI();
use Cwd;

$file_to_read = "raw.dat";
$table = "sonde";

# Connect to the database.
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost",
                         "root", "gian",
                         {'RaiseError' => 1});

#oeffnet Datei
if (open (SYSHANDLE,"<$file_to_read"))  { print "\n\t\tEinlesen beginnt ($file_to_read).\n"; }
else    { print "\n\n\t\tFehler: konnte \"$file_to_read\" nicht oeffnen... :-(\n"; exit; }

$dbh->do("DROP TABLE $table");
$dbh->do("CREATE TABLE $table (id VARCHAR(50))");

#liest Datei zeilenweise ein. Solange wie Zeilen vorhanden sind
while (<SYSHANDLE>)
{
    $dbh->do("INSERT INTO $table VALUES (". $dbh->quote($_) .")"); 
}       

printf ("\t\tZeilen eingelsesen und Datei geschlossen\n");


Schribskript

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
#########################################################
## Version Test Erstellt: 14.12.2010 Verfasser: Bremm
#########################################################

use Cwd;
use IO::Handle;

$file_to_write = "raw.dat";

if (open (SYSHANDLE,">$file_to_write")) { print "\n\t\tSchreiben beginnt ($file_to_write).\n"; }
else    { print "\n\n\t\tFehler: konnte \"$file_to_write\" nicht oeffnen... :-(\n"; exit; }
SYSHANDLE->autoflush(1);

for(my $i = 1; $i <= 100; $i++) {
 print SYSHANDLE "$i\n";
 sleep(1);
}
close(SYSHANDLE);


Ich hatte überlegt ob man irgendwas in die Richtung mit EOF anstellen kann. Ich weiß aber nicht, ob und wann genau der Schreibprozess ein EOF setzt.

Danke schonmal im Voraus für jede Hilfe

Gruß Gian
Last edited: 2010-12-14 12:37:32 +0100 (CET)

View full thread Datei schreiben und parallel einlesen