Schrift
[thread]12895[/thread]

Hilfestellung bei Datei einlesen

Leser: 3


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
jan99
 2008-12-12 02:35
#117109 #117109
User since
2008-09-18
439 Artikel
BenutzerIn
[default_avatar]
Moin !

ich habe mir ein Tool zusammengebastelt das eine vorhandene Datei zunächst sicher t, dessen Daten ausliest, sortiert und dann wieder schreibt.

Hier der Code

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
58
59
60
61
62
63
64
#!/usr/bin/perl

use strict;
use warnings;
use LWP::Simple;

# Variablendefinition
my $url='';

print("Sortieren von JOSM-Bookmarks\n");
print("----------------------------\n");

# Name der Bookmark-Datei
my $file_bookmark_name='test.txt';

# Name der Sicherungsdatei
my $file_bookmark_backup='test.bak';

# Verzeichnis in welchem sich das bookmark befindet
# dieses kann später noch autom. generiert werden
my $josm_appdata_folder='C:\\Users\\Tappenbeck\\AppData\\Roaming\\JOSM\\';

# Ist die BAK-Datei vorhanden ?
# ja => löschen

print "\nBackup loeschen ...\n";
if (-e $josm_appdata_folder.$file_bookmark_backup){
#löschen der bestehenden bookmark-datei
unlink $josm_appdata_folder.$file_bookmark_backup or warn "Kann Datei $file_bookmark_backup nicht loeschen !\n";
}else{
warn "Datei: $file_bookmark_backup nicht vorhanden !";
}

# Erstellen einer Kopie der BOOKMARK-Datei
print "\nBookmark sichern ...\n";
if (-e $josm_appdata_folder.$file_bookmark_name){
#sichern der bestehenden bookmark-datei
rename $josm_appdata_folder.$file_bookmark_name, $josm_appdata_folder.$file_bookmark_backup;
print "datei bearbeitung \n\n";
}else{
warn "Datei: $file_bookmark_name nicht gefunden !";
}


# Auslesen der BOOKMARK-Datei => Array
print "\nBackup einlesen ...\n";
open(DATEI, "<".$josm_appdata_folder.$file_bookmark_backup) || die "Fehler beim Öffnen der Bookmarkliste";
my @Zeilen = <DATEI>;
close(DATEI);

print "\nDaten sortieren ...\n";
# Sortieren des eingelesenen Array's
my @NeueZeilen;
@NeueZeilen = sort @Zeilen;

# Schreiben der sortierten BOOKMARK-Datei

print "\nsortierte Daten schreiben ...\n";
open(DATEI, ">c:/temp/test999.txt") || die "Bookmark-Datei kann nicht geschrieben werden !";
print DATEI @NeueZeilen;
close(DATEI);

# Fertig
print "\n... fertig !!\n";


Mein Problem liegt jetzt an der Stelle

Code: (dl )
open(DATEI, "<".$josm_appdata_folder.$file_bookmark_backup) || die "Fehler 


Es wird die angegebene Datei angeblich nicht gefunden - kann mir einer sagen wo mein Fehler liegt ?

Gruß Jan :-)
perl-Greenhorn - Win7 64bit / strawberry (ehem. activeperl) - www.OpenStreetMap.de
murphy
 2008-12-12 04:36
#117111 #117111
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
jan99+2008-12-12 01:35:05--
[...]
Code (perl): (dl )
open(DATEI, "<".$josm_appdata_folder.$file_bookmark_backup) || die "Fehler beim Öffnen der Bookmarkliste";

[...]


1) Es wäre besserer Stil und sicherer die Dreiargumentform von open zu verwenden – man weiss ja nie, ob in den verwendeten Variablen nicht doch irgendwann nach Modifikationen am Skript mal Benutzereingaben landen.

2) Es wäre sicher aufschlussreich, in der die-Meldung die Fehlerbeschreibung, die das Betriebssystem liefert, einzufügen.

3) Wenn man richtig schön portabel arbeiten will, sollte man Dateipfade eigentlich mit CPAN:File::Spec zusammensetzen.

Also besser mal so probieren:
Code (perl): (dl )
1
2
3
4
use File::Spec::Functions qw/catfile/;
[...]
open DATEI, '<', catfile($josm_appdata_folder, $file_bookmark_backup)
    or die "Fehler beim Öffnen der Bookmarkliste: $!";
When C++ is your hammer, every problem looks like your thumb.
Struppi
 2008-12-12 11:10
#117115 #117115
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Sollte man wirklich?
Perl arbeitet doch ohne Probleme Betriebssystemunabhängig mit dem Slash als Pfadtrenner.
Zumindest diese Angabe sollte so funktionieren
Code (perl): (dl )
my $josm_appdata_folder='C:/Users/Tappenbeck/AppData/Roaming/JOSM/';


Ach und ein Nachtrag:
CPAN:File::Copy wäre vielleicht auch was
pq
 2008-12-12 11:31
#117117 #117117
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Struppi+2008-12-12 10:10:03--
Perl arbeitet doch ohne Probleme Betriebssystemunabhängig mit dem Slash als Pfadtrenner.
Zumindest diese Angabe sollte so funktionieren
Code (perl): (dl )
my $josm_appdata_folder='C:/Users/Tappenbeck/AppData/Roaming/JOSM/';


unter windows und linux, ja. (wobei hier linux wohl sowieso nicht mit dem C: anfangen kann...)
aber es gibt noch andere betriebssysteme. also wenn man *wirklich*
portabel sein will, sollte man File::Spec nehmen. dafür ists ja da.
aber ich benutze es auch an einigen stellen nicht, weil ich zu faul bin...
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
Struppi
 2008-12-12 11:37
#117118 #117118
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wie? Auf anderen System kann Perl nicht eine Datei mit einem Slash als Pfadtrennern öffnen? Das wäre mir neu, ich dachte das macht Perl intern auf jedem System richtig.
murphy
 2008-12-12 16:05
#117125 #117125
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@Struppi: Perl übergibt den String so wie er ist einfach an die Betriebssystemfunktionen zum Öffnen der Datei – zufällig verstehen Windoof seit NT / XP und alle *nix / als Pfadtrennzeichen. Aber wenn man auf einem alten Windows oder DOS arbeitet oder auf einem alten MacOS <= 9 oder auf VMS oder was weiß ich wo, dann ist / eben kein Pfadtrennzeichen, sondern bestenfalls ein Zeichen, das ohne Bedeutung zu tragen in einem Dateinamen vorkommen darf, oder im ungünstigeren Fall ein unzulässiges Zeichen, das einen Fehler verursacht.
When C++ is your hammer, every problem looks like your thumb.
Struppi
 2008-12-12 16:11
#117126 #117126
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Da habe ich eine andere Erfahrung gemacht, ich kann auch ohne Probleme mit windows95 den Slash benutzen. Wie gesagt, meine Information war, dass Perl da OS unabhängig ist und das waren bisher auch meine Erfahrungen, ich hab aber nie mit etwas anderem als Windows oder Linux zu tun gehabt.
topeg
 2008-12-12 16:20
#117128 #117128
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Unter Windows wandelt Perl das "/" in "\" Mehr macht es aber nicht. Unter Mac und anderen Systemen gibt das Probleme. (bei MacOS < 10 ist z.B. ":" der Pfadtrenner)
Struppi
 2008-12-12 16:32
#117129 #117129
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wie gesagt ich noch nie mit anderen Systemen gearbeitet, ich dachte das Perl das wüßte, es weiß ja für welches System es kompiliert wurde. Insofern bin ich da bisher nie auf den Gedanken gekommen ein Modul zu benutzen.

D.h. also alle Skripte, die den Slash als Pfadtrenner verwenden, laufen nicht auf alten Macs?
GwenDragon
 2008-12-12 19:01
#117133 #117133
User since
2005-01-17
14540 Artikel
Admin1
[Homepage]
user image
Der Slash oder auch Backslash ist nicht portabel als Pfadtrenner.
Es geibt mehr Betriebssysteme bzw. Portierungen für Perl als nur unter Linux oder Windows!
die Drachin, Gwendolyn


Unterschiedliche Perl-Versionen auf Windows (fast wie perlbrew) • Meine Perl-Artikel

<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



View all threads created 2008-12-12 02:35.