Schrift
[thread]7401[/thread]

Auslesen aus .txt bis Trennzeichen, wie?: Auslesen aus .txt bis Trennzeichen, wie? (Seite 4)



<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten
pq
 2005-11-07 11:36
#59373 #59373
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
perldoc Text::CSV
was verstehst du denn an renees beispiel mit Text::CSV_XS nicht?

edit: typo\n\n

<!--EDIT|pq|1131519207-->
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
duerov
 2005-11-07 12:09
#59374 #59374
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Es geht dabei um das ganze Beispiel, nicht um das Text::CSV_XS. Habs aufgrund der Länge bloß nicht ganz zitiert.
Anfangs noch schnell die Frage: Wie ließt man bzw. was machen die Pfeile -> ?
Ich "verstehe" :-) den Code so:

Hier schätze ich mal trennt er in der .csv nach jedem ;
Hab mir das Modul Text::CSV runtergeladen, da bei Text::CSV_XS stand, dass der nur für die Linuxplatform sei.
Code: (dl )
my $parser = Text::CSV_XS->new({sep_char => ';'});

Was hier passiert ist mir nicht so klar. Man öffnet doch normalerweise mit open(DATA,"$file"). Was steht denn hier bei $fh drin, die erste Zeile?
Code: (dl )
open(my $fh,"<$file") or die $!;

Dann wird wohl Zeile für Zeile durchlaufen und jede Zeile (mit dem Modul) geparst?
Code: (dl )
1
2
while(my $line = <$fh>){
if($parser->parse($line)){

Hm, das ->fields() ist mir nicht ganz klar.
Code: (dl )
my @fields = $parser->fields();

Hier werden die Zeilen in @entries nacheinander reichgeschrieben? $fields[-1] ?
Code: (dl )
1
2
   push(@entries,[$line,$fields[-1]]);
}

Hier ist die Sortierung nach dem letzten Feld.
Code: (dl )
my @sorted = map{$_->[0]}sort{$a->[1] <=> $b->[1]}@entries;


Naja, wenn ich die paar Sachen wüsste wäre mir die ganze Sache mit den Modulen vielleicht ein wenig klarer.
Ich danke schonmal im Voraus
duerov
pq
 2005-11-07 12:55
#59375 #59375
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=duerov,07.11.2005, 11:09]Anfangs noch schnell die Frage: Wie ließt man bzw. was machen die Pfeile -> ?[/quote]
kommt drauf an. entweder sind es hash/array-dereferenzierungen oder
methoden-aufrufe.
Quote
Hab mir das Modul Text::CSV runtergeladen, da bei Text::CSV_XS stand, dass der nur für die Linuxplatform sei.

wo "stand" das? für dir _XS version ist ein compiler notwendig, das ist alles.
Quote
Was hier passiert ist mir nicht so klar. Man öffnet doch normalerweise mit open(DATA,"$file").

tatsächlich?
Quote
Was steht denn hier bei $fh drin, die erste Zeile?
Code: (dl )
open(my $fh,"<$file") or die $!;

nein, der Wiki:Filehandle.
Quote
Hm, das ->fields() ist mir nicht ganz klar.  
Code: (dl )
my @fields = $parser->fields();

was genau ist daran nicht klar? fields heißt auf deutsch felder. es ist ein
methodenaufruf auf die methode namens "fields". diese methode namens
"fields" gibt die fields (=felder) der gerade geparsten zeile zurück. als
liste.
Quote
Hier werden die Zeilen in @entries nacheinander reichgeschrieben? $fields[-1] ?
Code: (dl )
1
2
   push(@entries,[$line,$fields[-1]]);
}

nein, hier werden jeweils eine zeile ($line) und ein feld (das letzte feld)
als array-referenz in @entries gefüllt.
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
renee
 2005-11-08 00:17
#59376 #59376
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=duerov,07.11.2005, 09:53][quote=renee,03.11.2005, 13:46]Mal ein Schnellschuss:
use Text::CSV_XS;[/quote]
Morgen zusammen
So, jetzt interssiert mich wie ich die ganze Geschichte mit Modulen lösen kann. Hab mir dazu mal das Modul Text::CSV runtergeladen und installiert. Verstanden habe ich aber nicht richtig wie ich es anwenden soll. Was gibt mir denn das Modul ans Hauptprogramm?
Das Grundprinzip ist mir klar, aber die Schnittstelle zwischen Modul und Hauptprogramm nicht.
PS. Hab versucht es mir hier begreiflich zu machen:
http://www.infos24.de/perle/handbuch/18_module.htm
Gruß
duerov[/quote]
Das use Text::CSV_XS laedt das Modul. Das ist das gleiche wie das include bei C/C++ oder das import bei Java. Damit sagst Du dem Hauptprogramm, dass Du dieses Modul verwenden moechtest.

Bildlich:
Du kannst ja auch nicht einfach so einen Festbraten kochen, sondern Du musst erstmal das Rezept lesen und damit in Dein Gehirn laden. Jetzt weisst Du, dass Du das Rezept anwenden kannst und wenn Du dann mal was kochen willst, dann kannst Du darauf zurueckgreifen, quasi ein neues Objekt der Klasse "Festbraten" erzeugen...

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
# lade das Modul (siehe oben)
use Text::CSV_XS;

# Deklaration des Skalars $file und Initialisierung mit
# dem Pfad zu der CSV-Datei
my $file = '/pfad/zur/Datei.csv';
# Deklaration des Arrays @entries
my @entries;

# erzeugen des Text::CSV_XS-Objekts, mit der Eigenschaft
# ';' als Separator
my $parser = Text::CSV_XS->new({sep_char => ';'});

# oeffnen der CSV-Datei, bei Fehler, Fehlermeldung ausgeben
# und Programm beenden. In $fh ist der Filehandle, was in
# vielen Programmen einem DATA oder FH , ... entspricht
open(my $fh,"<$file") or die $!;

#Solange das Ende der Datei nicht erreicht wurde
while(my $line = <$fh>){

# Wenn das Parsen der Zeile erfolgreich war (Aufruf der
# Methode parse() des Objekts). Der -> entspricht hier
# dem . bei Java
if($parser->parse($line)){

# speichere die geparsten Felder in @fields (Aufruf der
# Methode fields() aus Text::CSV_XS
my @fields = $parser->fields();

# fuege eine Arrayreferenz mit der kompletten Zeile und
# dem letzten Feld als Inhalt an das Ende des @entries-
# Arrays ein
push(@entries,[$line,$fields[-1]]);
}
}
close $fh;

# sortiere nach dem letzten Feld (sort-Teil) und gebe immer die komplette
# Zeile zurueck (map-Teil)
my @sorted = map{$_->[0]}sort{$a->[1] <=> $b->[1]}@entries;

#Ausgabe
print $_,"\n" for(@sorted);
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/
duerov
 2005-11-08 12:00
#59377 #59377
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Danke für die guten Erklärungen.
Aber ich versteh trotzdem noch was falsch.
Quote
# fuege eine Arrayreferenz mit der kompletten Zeile und
# dem letzten Feld als Inhalt an das Ende des @entries-
# Arrays ein
Code: (dl )
push(@entries,[$line,$fields[-1]]);

Und zwar in obigem Code $line und $fields;
Mit $fields kann ich die Felder ansprechen, Also ist $fields[-1] (Hier also der Wert 12)
$line ist die komplette Zeile, also:
Firma 1 1234 92776194786 12
Sprich, wozu bräuchte ich dann $fields[-1]?

Meine Installation muss ich auch nochmal anschauen, glaub da hat was nicht hingehauen, bekomm ständig die Fehlermeldung:
Undefined Subroutine &Text::CSV_XS called at D:\Programme\Perl\eg\apo.pl line 13.
Code: (dl )
my $parser = Text::CSV_XS->({sep_char => ';'}); # Line 13

Installiert hab ichs so: ppm install Text-CSV_XS.ppd
pq
 2005-11-08 13:06
#59378 #59378
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=duerov,08.11.2005, 11:00]Meine Installation muss ich auch nochmal anschauen, glaub da hat was nicht hingehauen, bekomm ständig die Fehlermeldung:
Undefined Subroutine &Text::CSV_XS called at D:\Programme\Perl\eg\apo.pl line 13.
Code: (dl )
my $parser = Text::CSV_XS->({sep_char => ';'}); # Line 13

Installiert hab ichs so: ppm install Text-CSV_XS.ppd[/quote]
abtippen will gelernt sein. du hast ein 'new' vergessen.
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
duerov
 2005-11-08 15:11
#59379 #59379
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Ok, aber wenigstens hab ich nicht copy/paste verwendet.
1. Die Sache mit $line, $fields würde mich noch intressieren (siehe oben).
2. Und jetzt nochmal eine grundsätzliche Frage.
Was erledigt denn das Modul Text::CSV_XS genau? Was steht denn in dem "Rezept" drin, dass ;; und "" rausgenommen werden??? Bringt mir dieses Modul folgendes Format:
"Firma 1";1234;"92776194786";"12"
automatisch in dieses:
Firma 1 1234 92776194786 12 ???
Übernimmt dieses Modul die Formatierung, die ich in meinem ersten Versuch "manuell" gemacht habe jetzt automatisch???
Ich kann da googeln wie ich will, aber zu dem sch... Modul find ich keine näheren Erklärungen. Vielleicht kennt ja jemand nen Link... damit ich das Forum hier nicht weiter mit so grundsätzliche Fragen füll.\n\n

<!--EDIT|duerov|1131455493-->
Dubu
 2005-11-08 17:48
#59380 #59380
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
0. Copy & paste ist manchmal besser

1. @fields ist das Array mit den Feldern einer Zeile, $fields[-1] ist das letzte Feld. Wozu du das letzte Feld brauchst, wissen wir auch nicht, aber du hast gesagt, dass du es brauchst.

2. Text::CSV_XS (bzw. Text::CSV) ist dazu da, CSV-Dateien einzulesen und zu schreiben. Es splittet die Zeilen der Datei in Felder und kuemmert sich um das Entfernen von Quotezeichen etc.
Anleitungen von Perl-Modulen findet man nicht per Google, sondern per Kommandozeile: perldoc Text::CSV_XS.
Wer das nicht mag, schaut im CPAN nach.
Bei ActiveState Perl sollte auch automatisch die HTML-Doku aktualisiert sein, wenn ein neues Paket installiert wurde, AFAIK.
renee
 2005-11-09 08:42
#59381 #59381
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das letzte Feld ist das Feld nach dem sortiert werden soll (Deiner Aussage nach)...

Text::CSV* stellt die Methode zur Verfuegung, damit nicht alles mit Regulaeren Ausdruecken gemacht werden muss (was in 99% der Faelle wohl schiefgehen wuerde)...

Um weiterhin bildlich zu sprechen:
In dem Rezept steht was davon, dass Zutaten pueriert werden muessen. Du kannst es entweder per Hand machen - was nicht so fein wird - oder Du kannst einen Puerierstab verwenden, der Dir die puerier()-Methode zur Verfuegung stellt. Das Text::CSV* Modul ist genau dieser Puerierstab, der Dir viel Arbeit abnimmt und die Kueche sauber haelt...
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/
duerov
 2005-11-09 10:30
#59382 #59382
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Ok, danke!
Hab da nur nochmal nachgefragt, weil mir bei dem code den du gepostet hast nichts entfernt wird(vorausgesetzt ich hab da nicht wieder nen Fehler gemacht). Bekomme folgende zwei Fehlermeldungen:
1.
Quote
Argument "" isn`t numeric in numeric comparison <<=>> at D:/Programme... line 26.

2.
Quote
Use of uninitialized value in numeric comparison <<=>> at D:/Programme... line 26.

In CSV werden ja glaub ich "" als Leerstring interpretiert, da tut er sich natürlich mit dem Vergleichen von Zahlen schwer.
Wenn ich die Sortierung rausmache gibt er mir die Daten im selben Format aus wie die Quelldaten.

@Dubu
Zwecks
Quote
0. Copy & paste ist manchmal besser
--> Wenn ich was kann, gehts schneller, wenn ich was nicht kann trägt das bestimmt nicht zum besseren Verständnis bei einfach blind zu kopieren.
<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten



View all threads created 2005-10-26 14:09.