Schrift
[thread]170[/thread]

Transfer zwischen zwei dateien



<< >> 8 Einträge, 1 Seite
Gast Gast
 2004-02-15 16:53
#1228 #1228
Hallo habe folgendes Problem:

ich öffne eine Datei
ersetze die Umlaute und schreibe dann in eine 2. Datei aber es klappt nicht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
open (IN, "<daten.xml");
@file_lines = <IN>;
close IN;


open (OUT, ">daten2.xml") || die "cannot open file";
while (@file_lines)
{
$file_line=~s/ü/&uuml\;/g;
$file_line=~s/ö/&ouml\;/g;
$file_line=~s/ä/&auml\;/g;
print OUT  "$file_line";
}
close (OUT);


was mache ich falsch?

Edit by Erik: Code Tags gesetzt.\n\n

<!--EDIT|[E|B]|1076861600-->
Ronnie
 2004-02-15 17:15
#1229 #1229
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
foreach $file_line (@file_lines)
{
$file_line=~s/ü/&uuml\;/g;
$file_line=~s/ö/&ouml\;/g;
$file_line=~s/ä/&auml\;/g;
print OUT  "$file_line";
}


Woher soll dein Programm wissen was $file_line ist? Du solltest aber evtl. wirklich pq's Antwort aus dem anderen Thread berücksichtigen und HTML::Entities verwenden. Deinem Code entnehme ich das du noch Perl-Neuling bist, also empfehle ich dir mal das Perl-Tutorial auf Strat's Homepage.

Edit1:
Außerdem solltest du Perl-Programme immer wie folgt beginnen:
Code: (dl )
1
2
use strict;
use warnings;

Ersteres zwingt dich säuberer zu programmieren, z.B. Variablen vor der Benutzung zu deklarieren. Zweiteres informiert dich über evtl. Fehler die du gemacht hast.

Gruss,
Ronnie\n\n

<!--EDIT|Ronnie|1076858227-->
pq
 2004-02-15 17:23
#1230 #1230
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Guest,15.02.2004, 15:53]Hallo habe folgendes Problem:

ich öffne eine Datei
ersetze die Umlaute und schreibe dann in eine 2. Datei aber es klappt nicht:

[CODopen (IN, "<daten.xml");[/quote]
setze bitte das nächste mal richtige code-tags.
warum überprüfst du nicht, ob das open geklappt hat?
open IN, '<', 'daten.xml' or die "Konnte daten.xml nicht öffnen, weil: $!";
Quote
@file_lines = <IN>;

bitte alle variablen deklarieren!
my @file_lines = <IN>;
Quote
open (OUT, ">daten2.xml") || die "cannot open file";

auch hier empfiehlt es sich, perl nach dem grund zu fragen, ausserdem
ist ein 'or' idiomatischer als ||:
open OUT, '>','daten2.xml' or die "cannot open file: $!";
Quote
while (@file_lines)
{

das heisst übersetzt: 'solange das array @file_lines nicht leer ist'.
aber du tust ja gar nichts mit dem array. warum sollte es also jemals leer
sein? das programm läuft endlos weiter, wir haben es also hier mit einem
klassischen exemplar einer endlos-schleife zu tun.
foreach my $file_line (@file_lines) {
Quote
$file_line=~s/ü/&uuml\;/g;
$file_line=~s/ö/&ouml\;/g;
$file_line=~s/ä/&auml\;/g;

wieso ersetzt du umlaute, aber kein ß? wiedermal ein klassisches beispiel,
warum man HTML::Entities benutzen sollte, damit man keine zeichen vergisst:
encode_entities($file_line);
Quote
print OUT  "$file_line";

warum schreibst du die variable in anführungszeichen?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2004-02-16 13:49
#1231 #1231
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Außerdem gibt es keinen Grund, die Ausgangsdatei erstmal in ein Array zu speichern, das ist nur Platzverschwendung bzw. Dein Programm versagt bei großen Dateien.

Code: (dl )
1
2
3
4
5
6
7
8
open (IN, "<daten.xml") or die $!;
open (OUT, ">daten2.xml") or die "cannot open file : $!";
while (<IN>) {
   encode_entities;
   print OUT;
}
close OUT or die $!;
close IN or die $!;


Und durch die Benutzung von "es" ist alles auch gleich besser lesbar. (Wobei ich jetzt nicht weiß, ob encode_entities per default $_ ändert, wenn man kein Argument angibt, aber ich hoffe es mal stark.)\n\n

<!--EDIT|Crian|1076932433-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Strat
 2004-02-17 00:53
#1232 #1232
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
oder so?

Code: (dl )
1
2
3
4
5
6
7
open (IN, "daten1.xml") or die "cannot read from file : $!";
open (OUT, ">daten2.xml") or die "cannot write to file : $!";
while (<IN>) {
   print OUT encode_entities($_);
}
close OUT or die $!;
close IN or die $!;
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
eisbeer
 2004-02-19 19:44
#1233 #1233
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich sehe keinen unterschied zwischen starts und crians :p
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
Strat
 2004-02-20 02:20
#1234 #1234
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich verzichte auf eine variable $_ und lasse mich nicht auf das Gluecksspiel ein, ob encode_entities wieder brav nach $_ zurueckschreibt oder nicht (tut es naemlich meiner Meinung nach nicht)
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
eisbeer
 2004-02-20 12:43
#1235 #1235
User since
2003-08-29
347 Artikel
BenutzerIn
[Homepage] [default_avatar]
OK, das tut es meiner meinung auch nicht. Aber im Grunde ist trotzdem kein unterschied.
Vielleicht kann marc deins (strat) besser verstehn ...
Die meisten PC Probleme befinden sich zwischen Bildschirm und Stuhl...
<< >> 8 Einträge, 1 Seite



View all threads created 2004-02-15 16:53.