Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]7401[/thread]

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



<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten
duerov
 2005-11-02 13:13
#59363 #59363
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Könntest du das bitte kurz erkläutern?
Was machen die q~ in @data?
Und wie ließt man das map{$_->[0]} ?
Hab mal folgendes geschrieben, aber ohne Wirkung und ohne Fehlermeldung:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
open(DATEI,"datei.txt") || die "Apothekenfile nicht gefunden";
while(<DATEI>)
{
open(SERVER1,">>apo_server1.txt") || die "Datei apo_server1.txt nicht gefunden";
{
@unsorted = "$_";
my @sorted = map{$_->[0]}sort{$a->[1]->[-1] <=> $b->[1]->[-1]}map{[$_,[split(/ /,$_)]]}@unsorted;
print SERVER1 $_ for(@sorted);

}
close(SERVER1);
}
close(DATEI);
renee
 2005-11-02 13:40
#59364 #59364
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
das q~xxx~ ersetzt 'xxx' (siehe http://www.perl.com/doc/manual/html/pod/perlfunc/qSTRING.html )

Das map{} gibt fuer eine Liste das zurueck, was innerhalb von {} "berechnet" wird (siehe perldoc -f map )

also gibt
Code: (dl )
print $_,"\n" for(map{$_ * $_}(1,2,3));
die Quadratzahlen von 1 bis 3 aus...

(1,2,3) ist die Liste
und map macht jetzt fuer jedes Element der Liste das was innerhalb von {} steht (also hier quadrieren) und gibt das zurueck...
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/
renee
 2005-11-02 13:43
#59365 #59365
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein Code sollte wohl eher so aussehen:
Code: (dl )
1
2
3
4
5
6
7
8
9
open(DATEI,"datei.txt") || die "Apothekenfile nicht gefunden";
my @unsorted = <DATEI>;
close(DATEI);

my @sorted = map{$_->[0]}sort{$a->[1]->[-1] <=> $b->[1]->[-1]}map{[$_,[split(/ /,$_)]]}@unsorted;

open(SERVER1,">>apo_server1.txt") || die "Datei apo_server1.txt nicht gefunden";
print SERVER1 $_ for(@sorted);
close(SERVER1);
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-03 11:23
#59366 #59366
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Guten Morgen, ich bins nochmal!
Nachdem leider alles nichts gefruchtet hat hab ich alles weggehauen und versuchs jetzt nochmal von vorne. Mit dem ersten Codeblock formatiere ich folgende .txt:
"Firma 1 A";1234;"91673627385";"03"
"Firma 2 B";1234567;"78112965628";""
"Firma 3C";7654321;"";"01"
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!D:/Perl/

use strict;
use warnings;

open(DATA,"neu-1.txt") or die "Konnte File nicht oeffnen\n";
while (<DATA>)
{
chomp;
my @row = split /;/, $_; # Bei; wird getrennt
@row = map { s/"/ /g; $_ } @row; # Ersetzt " durch 'Leerzeichen'

open(DATEI,">>datei.txt") || die "File nicht gefunden";
if ("$row[3]" =~ /01/ || "$row[3]" =~ /02/ || "$row[3]" =~ /03/)

{

Mit dem zweiten Codeblock wollte ich mir nur mal die letzten Zahlen (hier 03 und 01) sortiert ausgeben bzw. wenns funktionieren würde eintragen, geht aber nicht.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
for($row[3])
{
my @sortierung = sort NummernSort $row[3];
for (@sortierung)
{

print $_,"\n";
}
}

sub NummernSort
{
if($a < $b)
{ return -1; }
elsif($a == $b)
{ return 0; }
else
{ return 1; }
}

Im dritten Codeblock formatiere ich meine .txt damit sie so aussieht:
Firma 1 A 1234 91673627385 03
Firma 3C 7654321 01
Allerdings sollte das halt nach den letzten Zahl sortiert sein:
Firma 3C 7654321 01
Firma 1 A 1234 91673627385 03
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
for($row[0])
{
$_ =~ s/^\s+//g; # Leerzeichen am Anfang entfernen
print DATEI "$_";
}
for($row[1])
{
$_ =~ s/^\s+//g;
$_ = sprintf("%07i",$_); # Von links auf 7 Stellen mit Nullern auffüllen
print DATEI "$_";
}
for($row[2])
{
print DATEI "$_";
}
for($row[3])
{
$_ =~ s/^\s+//g; # Leerzeichen am Anfang entfernen
print DATEI "$_";
}
print DATEI"\n";
}
close(DATEI)

}
close(DATA);

Hab es jedenfalls nicht geschaft, dieses dritte Feld ($row[3]) so anzusprechen, dass ich danach sortieren kann. Die in den vorigen Beiträgen genannten Sortierverfahren hab ich auch schon probiert. Das Problem ist, dass mir die Erklärungen in den Tutorials schon klar sind, ich das aber bei dieser Aufgabe einfach nicht auf die Reihe krieg.
Wär schön wenn sich das jemand nochmal anschauen könnte.
Gruß
duerov
renee
 2005-11-03 14:38
#59367 #59367
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum nimmst Du nicht die ganzen Code-Vorschlaege die hier gemacht wurden?? Zumindest meine Codes waren getestet und sollten funktionieren...
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/
renee
 2005-11-03 14:46
#59368 #59368
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mal ein Schnellschuss:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Text::CSV_XS;

my $file = '/pfad/zur/Datei.csv';
my @entries;

my $parser = Text::CSV_XS->new({sep_char => ';'});

open(my $fh,"<$file") or die $!;
while(my $line = <$fh>){
if($parser->parse($line)){
my @fields = $parser->fields();
push(@entries,[$line,$fields[-1]]);
}
}
close $fh;

my @sorted = map{$_->[0]}sort{$a->[1] <=> $b->[1]}@entries;

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/
renee
 2005-11-03 14:48
#59369 #59369
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Uebrigens bringt ein "fruchtet nicht" nicht wirklich viel. Hier solltest Du Code posten und die entsprechenden Fehlermeldungen. Es waren vermutlich irgendwelchen "Benutzungsfehler" von Dir...
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-03 18:05
#59370 #59370
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Ok, habs jetzt so realisiert wie du im Posting (02.11.2005, 12:43) geschrieben hast. Hat zwar gedauert, aber funktioniert jetzt. Jetzt muss ich nur noch die Anzahl aller Einträge durch 6 teilen und in 6 verschiedene .txt Dateien schreiben. Wenn du da noch einen schnellen Tipp hättest wär ich so gut wie fertig. Braucht keine Code zu sein, nur ein Weg. Hab mir mal die Anzahl der Datensätze ausgeben lassen muss jetzt halt noch überlegen wie ich die verwerten kann.
Gruß und Dank!
duerov
 2005-11-03 19:52
#59371 #59371
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
So, hat sich erledigt, hab alles hinbekommen, ole!
Euch allen die mir dabei geholfen haben jedenfalls vielen Dank!!!
Schönen Abend noch
duerov
duerov
 2005-11-07 10:53
#59372 #59372
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
[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
<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten



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