Schrift
[thread]7401[/thread]

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



<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten
frodus
 2005-11-09 11:46
#59383 #59383
User since
2003-09-26
147 Artikel
BenutzerIn
[default_avatar]
Vielleicht hilt das:

http://search.cpan.org/~alancitt/Text-CSV-0.01/CSV.pm
Dubu
 2005-11-09 12:02
#59384 #59384
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Das sind keine Fehlermeldungen sondern Warnungen. Deine Interpretation, woher diese kommen, wird richtig sein. Um die Warnungen weg zu bekommen, kannst du entweder vor dem Sortieren dafuer sorgen, dass leere Angaben in Nullen geaendert werden, oder das beim Sortieren beruecksichtigen.

Also:
Code: (dl )
1
2
3
4
5
6
# evtl. Leerstrings im letzten Feld durch Nullen ersetzen
$_->[-1] = 0 unless $_->[-1] for @entries;

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

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


Die zweite Methode wird bei groesseren Listen laenger dauern, weil beim Sortieren der Vergleichscode meist haeufiger ausgefuehrt wird.
duerov
 2005-11-09 13:22
#59385 #59385
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Hm, bis zum Sortieren bin ich eigentlich noch nicht gekommen. Wie ich oben schon geschrieben habe, parst er meine Datei garnicht. Wenn ich statt dem sort-Befehl folgendes schreibe
Code: (dl )
my @sorted = map{$_->[0]}@entries;

und mir das ausgeben lasse, bekomm ich mein ursprüngliches Format also:
"Firma 1";1234;"92776194786";"12" und nicht
Firma 1 1234 92776194786 12
Erstmal brauche ich ja das Format, dann kümmer ich mich ums Sortieren.
Nochwas, in $csv = Text::CSV_XS->new(); steht ja folgendes drin:
Code: (dl )
1
2
'quote_char'  => '"'
'escape_char' => '"'
Ich hoffe mal, dass er mit meinem zweiten Feld (die Zahl: 1234) zurecht kommt (bzw. die erkennt), die ist nämlich nicht in "" geschrieben.
Dubu
 2005-11-09 13:58
#59386 #59386
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Zeig doch mal den Code.

Nachtrag: Wenn du den Code von esskar oben so einfach uebernommen hast: Der sortiert zwar die Eingabezeilen, aber merkt sich nicht die einzelnen Felder, sondern nur die urspruenglichen Zeilen (@fields wird ja nicht ueber die Schleife hinais gespeichert)!\n\n

<!--EDIT|Dubu|1131537654-->
Crian
 2005-11-09 14:47
#59387 #59387
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Tipp: Immer copy&paste verwenden. Dann kannst du den Code immer noch an deinen Stil anpassen, aber abschreiben ist fehlerträchtig.\n\n

<!--EDIT|Crian|1131540505-->
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
renee
 2005-11-10 00:48
#59388 #59388
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=duerov,09.11.2005, 12:22]Hm, bis zum Sortieren bin ich eigentlich noch nicht gekommen. Wie ich oben schon geschrieben habe, parst er meine Datei garnicht. Wenn ich statt dem sort-Befehl folgendes schreibe
Code: (dl )
my @sorted = map{$_->[0]}@entries;

und mir das ausgeben lasse, bekomm ich mein ursprüngliches Format also:
"Firma 1";1234;"92776194786";"12" und nicht
Firma 1 1234 92776194786 12

[...][/quote]
Ist klar, weil ich ja in der Arrayreferenz die urspruengliche Zeile speicher (also so wie es in der Datei steht). Das Format wie Du es haben willst bekommst Du mit
Code: (dl )
join(' ',@fields);
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-10 15:07
#59389 #59389
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Vielen Dank!
Hab das jetzt alles so gut wie geschafft. Allerdings gibt es noch einen Haken. Kann es sein, dass dieses Text::CSV_XS Modul mit Umlauten nicht zurecht kommt? In meiner vorherigen Methode (über Regular Expressions) hatte ich am Schluss 171 Zeilen, jetzt hab ich nur 155. Also hab ich mal die 16 fehlenden rausgesucht. Dabei handelt es sich ausschließlich um Namen die ein ä,ö,ü,ß... beinhalten. Die hat er mir einfach rausgepfiffen.
Gruß!
pq
 2005-11-10 15:24
#59390 #59390
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
versuchs mal mit der option binary => 1, dann sollte das auch mit umlauten klappen.

edit: und error_input solltest du auch abfragen, wenn parse fehlschlägt.
dann siehst du gleich, welche zeilen ärger machen.\n\n

<!--EDIT|pq|1131629195-->
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-10 15:30
#59391 #59391
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Opti, jetzt gehts. Danke!
duerov
 2005-11-10 17:10
#59392 #59392
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal,
so sieht mein optimierter Code aus. Hab 50 Zeilen im Vergleich zum Vorgänger kürzen können. Falls jemand Vorschläge hat wie man was anders/kürzer/besser... machen kann...
Wär es sinnvoll, die "Serverlastverteilung" zwecks Übersichtlichkeit auszulagern? Müsst ich da dann ein Modul schreiben? Oder den Abschnitt in eine ander Perldatei und die dann einbinden?
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!D:/Programme/Perl -w

use strict;
use warnings;
use Text::CSV_XS;

my @fields;
my $geparst;
my @geparst;
my $i;

my $file = 'apo_neu-1.csv';
my @entries;

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


'binary' => 1


});

open(DATEI,">datei.txt") or die $!;
open(my $fh,"<$file") or die "File apo_neu-1.csv nicht gefunden";
while (my $line = <$fh>)
{
if($parser->parse($line))
{
@fields = $parser->fields();

if ($fields[-1] =~ m/^\d{2}$/ and $fields[-1] > 0 and $fields[-1] <= 49) # Nur Zahlen von 01 bis 49
{ &nbsp
;
my $geparst = join (' ',@fields);
@geparst = $geparst;
print DATEI $_,"\n" for(@geparst);
}

}
}
close $fh;
close (DATEI);

open(DATEI,"datei.txt") || die "File datei.txt nicht gefunden";
@geparst = <DATEI>;
close(DATEI);

my @sorted = map{$_->[0]}sort{$a->[1]->[-1] <=> $b->[1]->[-1]}map{[$_,[split(/ /,$_)]]}@geparst; # Sortieren nach dem letzten Arrayfeld
my $anzahl = @sorted;

open(DATEI,">datei.txt") || die $!;
print DATEI $_ for(@sorted);
close(DATEI);

#-----------------------------------------------------------------------------------------
# Aufteilen der Daten auf 6 Server
#-----------------------------------------------------------------------------------------

open(SERVER1,">apo_server1.txt") || die "Datei apo_server1.txt nicht gefunden";
for($i=0; $i<$anzahl;)
{
print SERVER1 $sorted[$i];
$i += 6;
}
close(SERVER1);

#---------------------------------------------------------------------------------------

open(SERVER2,">apo_server2.txt") || die "Datei apo_server2.txt nicht gefunden";
for($i=1; $i<$anzahl;)
{
print SERVER2 $sorted[$i];
$i +=6;
}
close(SERVER2);

#-----------------------------------------------------------------------------------------

open(SERVER3,">apo_server3.txt") || die "Datei apo_server3.txt nicht gefunden";
for($i=2; $i<$anzahl;)
{
print SERVER3 $sorted[$i];
$i +=6;
}
close(SERVER3);

#-----------------------------------------------------------------------------------------

open(SERVER4,">apo_server4.txt") || die "Datei apo_server4.txt nicht gefunden";
for($i=3; $i<$anzahl;)
{
print SERVER4 $sorted[$i];
$i +=6;
}
close(SERVER4);

#-----------------------------------------------------------------------------------------

open(SERVER5,">apo_server5.txt") || die "Datei apo_server5.txt nicht gefunden";
for($i=4; $i<$anzahl;)
{
print SERVER5 $sorted[$i];
$i +=6;
}
close(SERVER5);

#-----------------------------------------------------------------------------------------

open(SERVER6,">apo_server6.txt") || die "Datei apo_server6.txt nicht gefunden";
for($i=5; $i<$anzahl;)
{
print SERVER6 $sorted[$i];
$i +=6;
}
close(SERVER6);

#-----------------------------------------------------------------------------------------

Und danke nochmal, ohne eure Hilfe wär das in 100 Jahren nichts geworden.
<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten



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