Hilfe bei der Programmierung !

Hi,

ich möchte ein Program haben, dass ein txt-File als input bekommt, wie folgende Datei:
------------------begin-------------------------
Lastname1, Firstname1

Lastname2, Firstname2

Lastname3, Firstname3
---------------------end-----------------------

dann liest das Programm die daten aus Input-File und gibt eine Datei als Output zurück, dass sie so aussieht:

-----------------begin-----------------
dn: cn=Lastname1 (Firstname1 )
givenName: Firstname1
sn: Lastname1
uid: lastname1+erste buchstabe von firstname1
uidNumber: 101
mail: [email protected]

dn: cn=Lastname2 (Firstname2 )
givenName: Firstname2
sn: Lastname2
uid: lastname2+erste buchstabe von firstname2
uidNumber: 102
mail: [email protected]

dn: cn=Lastname3 (Firstname3 )
givenName: Firstname3
sn: Lastname3
uid: lastname3+erste buchstabe von firstname3
uidNumber: 103
mail: [email protected]
----------------------end---------------------------

kann Jemand mir helfen??

Viele Grüße
Miriam

Ich langweilte mich gerade (nur ein schneller Hack ohne Feinheiten):

────────────────────────────────────────────────────────────────
import re

templ = """
dn: cn=%(last)s (%(first)s)
givenName: %(first)s
sn: %(last)s
uid: %(last)s%(firstFirstLetter)s
uidNumber: %(uidNo)d
mail: %(first)s.%(last)[email protected]
"""

dateiinhalt = open("input.txt").read()

lastfirst = re.findall(r"^\s\*(.+?)\s\*,\s\*(.+?)\s\*$(?m)",dateiinhalt)

uidNumber = 101
for l,f in lastfirst:
 print templ % {"last":l,"first":f,"firstFirstLetter":f[0],"uidNo":uidNumber}
 uidNumber += 1
────────────────────────────────────────────────────────────────

Das ist Python 2.5

Aus …

────────────────────────────────────────────────────────────────
Doe,John

Castro, Fidel
────────────────────────────────────────────────────────────────

…wird dann …

────────────────────────────────────────────────────────────────
dn: cn=Doe (John)
givenName: John
sn: Doe
uid: DoeJ
uidNumber: 101
mail: [email protected]

dn: cn=Castro (Fidel)
givenName: Fidel
sn: Castro
uid: CastroF
uidNumber: 102
mail: [email protected]
────────────────────────────────────────────────────────────────

Jan

Hallo,

ich möchte ein Program haben, dass ein txt-File als input
bekommt, wie folgende Datei:
------------------begin-------------------------
Lastname1, Firstname1

Lastname2, Firstname2

Lastname3, Firstname3
---------------------end-----------------------

dann liest das Programm die daten aus Input-File und gibt eine
Datei als Output zurück, dass sie so aussieht:

-----------------begin-----------------
dn: cn=Lastname1 (Firstname1 )
givenName: Firstname1
sn: Lastname1
uid: lastname1+erste buchstabe von firstname1
uidNumber: 101
mail: [email protected]

kann Jemand mir helfen??

JayVee hat ja eine schöne Python-Lösung vorgegeben,
da kann ich mit Perl nicht nachstehen :wink:

(Das ist das Richtige um die nötige Bettschwere zu erreichen :wink:

In Perl sähe das so aus:

[umwandeln.pl]

my $template =
'dn: cn=$L ($F)
givenName: $F
sn: $L
uid: $L$A
uidNumber: $N
mail: [email protected]

';

 my $fnIn = shift; # Namen der Eingabedatei aus Programmparameter lesen
(my $fnOu = $fnIn) =~ s/[^.]+$/out/; # Ausgabenamen ableiten, .txt -\> .out
 open my $fi, '', $fnOu or die $!; # Ausgabedatei oeffnen, ggf. Fehlermeldung
 $/ = ''; # Absatzweise einlesen
 while() { # Eingabedatei-Zeilen lesen 
 my ($L, $F, $A, $N) = (/(\w+)[,\s]+((\w)\w+)/g, 100+$.); # Starte mit 101
 (my $form = $template) =~ s/(\$\w)/$1/eeg; # Template-Kuerzel ersetzen
 print $fo $form # formatierte Daten ausgeben
 }

Der Aufruf erfolgt wie erwartet mit:

 perl umwandeln.pl eingabe.txt

und liefert dann eine Datei „eingabe.out“.

Grüße

CMБ

Hallo Semjon,

danke für deine tolles Programm. Ich möchte noch, dass die „UID“ mit kleinen Buchstaben in der Output-File geschrieben werden.

Zumbeispiel, wenn der Lasatname „Schmitt“ und der Firstname „Joachim“ sind, in output file uid mit schmittj ersetzt wird.

du hattest das Programm so klein und kurz geschrieben, dass ich die Parameter kaum vershtehen kann.

danke für deine Mühe

Übriegens:
ich wollte JayVee auch bedanken für das Phyton-Programm. da ich für Perl kein speziale Compiler brauchte, hab mir das Perl-Programm genommen.

Viele Grüße
Miriam

Hallo

Ich möchte noch, dass die „UID“ mit kleinen Buchstaben
in der Output-File geschrieben werden.

Dafür könnte man einen Parameter $U erfinden,
der diesen Wert dann wie gewünscht enthält:

...
uid: $U
...

Das Programm sähe dann so aus:

my $template =
'dn: cn=$L ($F)
givenName: $F
sn: $L
uid: $U
uidNumber: $N
mail: [email protected]

';

 my $fnIn = shift; # Namen der Eingabedatei aus Programmparameter lesen
(my $fnOu = $fnIn) =~ s/[^.]+$/out/; # Ausgabenamen ableiten, .txt -\> .out
 open my $fi, '', $fnOu or die $!; # Ausgabedatei oeffnen, ggf. Fehlermeldung
 $/ = ''; # Absatzweise einlesen
 while() {; # Eingabedatei-Zeilen lesen 
 my ($L, $F, $A, $N) = (/(\w+)[,\s]+((\w)\w+)/g, 100+$.); # Starte mit 101
<u>my $U = lc $L.$A;</u> # uid jetzt in Kleinbuchstaben
 (my $form = $template) =~ s/(\$\w)/$1/eeg; # Template-Kuerzel ersetzen
 print $fo $form # formatierte Daten ausgeben
 }

ich wollte JayVee auch bedanken für das Phyton-Programm. da
ich für Perl kein speziale Compiler brauchte, hab mir das
Perl-Programm genommen.

Ehrlich gesagt gefällt mir JayVee’s Programm konzeptionell
besser als mein Eigenes, da es sich nicht auf Codeevaluation
verläßt. Aber ich wollte mal eine eine doppelte Variablen-
evaluation (Regex mit /eeg) als Variante bringen.

Grüße

CMБ

Anmerkung: Python und Compiler
Hallo

nochwas gerade gesehen …

Übrigens :ich wollte JayVee auch bedanken für das Python-
Programm. da ich für Perl kein speziale Compiler brauchte,
hab mir das Perl-Programm genommen.

In dieser Hinsicht besteht zwischen Python und Perl
kein Unterschied. Wenn man die fehlende Dateibe-
handlung zu JayVee’s Programm hinzufügt,:

[umwandeln.py]

import re,sys

templ = """dn: cn=%(L)s (%(F)s)
givenName: %(F)s
sn: %(L)s
uid: %(U)s
uidNumber: %(N)d
mail: %(F)s.%(L)[email protected]

"""

fnIn = sys.argv[1]
fnTo = re.sub(r'[^.]+$', 'out', fnIn)
In = open(fnIn, 'r')
To = open(fnTo, 'w')
N = 100
for line in In:
 m = re.search(r'(\w+)[,\s]+((\w)\w+)', line)
 if m:
 L,F,A = m.groups()
 U = (L+A).lower()
 N += 1
 To.write(templ % {'L':L,'F':F,'U':U,'N':N})

ruft man dieses dann auf mit:

 python umwandeln.py eingabe.txt

und erhält dann eine Datei „eingabe.out“.

(Ich bin kein Pythonist, daher ist mein
Pythonstil wahrscheinlich „zu Perlish“ :wink:

Grüße

CMБ