Schrift
[thread]7401[/thread]

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



<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten
duerov
 2005-10-26 17:26
#59353 #59353
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Also erstmal vielen Dank an alle,
hab mir eure Lösungen angeschaut und bin schon ein gutes Stück weiter gekommen. Ist allerdings auch eine ziemliche Informationsflut die ich erstmal verdauen muss.
Ja, es können bis jetzt Semikolon (') vorkommen, aber das ignoriere ich für den Anfang erstmal, sonst blick ich garnicht mehr durch. Ja, es handelt sich (ursprünglich) um eine csv Datei.
Hätte jetzt nochmal eine kleine Zusatzfrage: Ich will nur die Datensätze speichern, bei denen im letzten Feld irgendwas steht (z.B. aus ursprüngliche csv-Datei: "12"). Hab eine if-Abfrage gemacht: if ($row[3] eq '12') die nicht funktioniert. Mach ich allerdings testweise folgende if-Abfrage:if ($row[1] eq '1234567') findet er den Eintrag und schreibt ihn in die neue Datei. Kann das dran liegen, dass die Zahl vorher (in alter csv) ohne "" in der csv war?
Danke schonmal
duerov
Matze
 2005-10-26 17:47
#59354 #59354
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
Es könnte daran liagen das du vorher nicht alle Anführungszeichen gelöscht hast.
Wenn du das ganze einfach nur in ein Array spittest, anhand von ";", dann enthällt $row[3] bei dir "12" anstatt 12.
Also solltest du entweder so abfragen:
if ($row[3] eq qq("12")) {
mach irgendwas ...
}
oder alle Anführungszeichen löschen.

MfG. Matze
Mit freundlichen Grüßen: Matze
Dubu
 2005-10-26 19:05
#59355 #59355
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=duerov,26.10.2005, 15:26]Ja, es können bis jetzt Semikolon (') vorkommen,[/quote]
Das ist kein Semikolon, sondern ein einfaches Anführungszeichen.
Ein Semikolon, auch Strichpunkt genannt, sieht so aus: ";"
Semikolon ist dein Feldtrenner, und du bekommst ein Problem, wenn der innerhalb deiner Felder auftauchen kann. (Deshalb mein Vorschlag mit Text::CSV oder Text::CSV_XS, das kümmert sich darum.)

Edit: Sch... Smileys\n\n

<!--EDIT|Dubu|1130339177-->
duerov
 2005-10-27 10:40
#59356 #59356
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Guten Morgen zusammen!
@Dubu
Sorry, bin wohl schon zu lange davor gesessen, so dass ich nichtmal mehr ein Semikolon von einem Anführungszeichen unterscheiden konnte. Semikolons kommen jedenfalls nicht vor, werden nur zur Trennung der Felder verwendet. Schau mir deinen Vorschlag aber trotzdem mal an.
@Matze
Daran hats leider nicht gelegen, hab da auch schon alle möglichen Varianten durchprobiert.

Schönen Gruß
duerov
J-jayz-Z
 2005-10-27 11:28
#59357 #59357
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=Guest,26.10.2005, 12:09]Hab das schon mit substr probiert, geht aber glaub ich nicht, weil die Einträge ja immer unterschiedlich lang sind.[/quote]
Klar geht es, aber es ist aufwendig ;)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl
use strict;
use warnings;

my $name = 'Name von Firma1";1234567;"08001234567";"12"';

my $firmenname = substr($name, 0, index($name, ';')-1);
$name = substr($name, index($name, ';')+1, rindex($name, ';'));
my $nr1 = substr($name, 0, index($name, ';'));
$name = substr($name, index($name, ';')+1, rindex($name, ';'));
my $nr2 = substr($name, 1, index($name, ';')-2);
$name = substr($name, index($name, ';')+1, index($name, ';')-1);
my $last = substr($name, 1, index($name, ';'));

print $firmenname . "\n" . $nr1 . "\n" . $nr2 . "\n" . $last . "\n";
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
duerov
 2005-10-28 16:44
#59358 #59358
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Hallo nochmal!
Hätte noch was.
Hab jetzt alle Daten in folgendem Format in meiner .txt stehen.
Firma1 8263112 94626384523 16
Firma2 8263112 94626384523 33
Firma3 8263112 94626384523 04
Nun möchte ich die nach der letzten Zahl (04,16,33) sortieren -> Ziel ->
Firma3 8263112 94626384523 04
Firma1 8263112 94626384523 16
Firma2 8263112 94626384523 33
Hab das mal so probiert (nur Ausgabe):
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
open(DATEI,"datei.txt") || die "File nicht gefunden";
while(<DATEI>)
{
my @anzahl = $_;
my @sortierung = sort(NummernSort @anzahl); #<--Da muss was in der Art (Nummern Sort $anzahl[3]); rein
for(@sortierung)
{
print $_;
}

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

Was hier halt noch fehlt ist der Zugriff auf die im Array stehenden Zahlen (16,33,04). Hab schon einiges ausprobiert, aber entweder Fehlermeldung oder kein Effekt.
Gruß und Dank im Voraus
duerov\n\n

<!--EDIT|duerov|1130503594-->
Ronnie
 2005-10-28 16:56
#59359 #59359
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;

my @unsorted;
my @sorted;

while (<DATA>) {
push @unsorted, [split /\s+/, $_];
}

@sorted = sort { $a->[3] <=> $b->[3] } @unsorted;
print join " ", @$_, "\n" for @sorted;

_ _DATA_ _
Firma1 8263112 94626384523 16
Firma2 8263112 94626384523 33
Firma3 8263112 94626384523 04

EDIT: _ _DATA_ _ muss ohne die Leerzeichen zwischen den Underscores geschrieben werden (Bug vom Forum).\n\n

<!--EDIT|Ronnie|1130505347-->
duerov
 2005-11-02 10:53
#59360 #59360
User since
2005-10-26
27 Artikel
BenutzerIn
[default_avatar]
Guten Morgen zusammen!
@Ronnie:
Danke, das würde auch funktionieren, wenn ich beim Namen "Firma1" nicht hin und wieder Leerzeichen drin hätte ("Firma 1 A"). Damit trennt er an der falschen Stelle. Wollte jetzt die Leerzeichen rausnehmen ("Firma1A") und dann sortieren. Aber wie krieg ich danach den ursprünglichen Text ("Firma 1 A") wieder her (Außerdem hat er mir wieder alle Leerzeichen raus, nicht nur die in $row[0] )
Gruß und Dank
duerov
Ronnie
 2005-11-02 11:56
#59361 #59361
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Hm, du könntest es einfach mal rückwärts probieren:
Code: (dl )
@sorted = sort { $a->[-1] <=> $b->[-1] } @unsorted;

Ansonsten müsstest du dir Gedanken über Delimiter machen die eindeutig sind, anstatt der Leerzeichen.
renee
 2005-11-02 12:41
#59362 #59362
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

my @data = (q~Name von Firma1 1234567 08001234567 12~,
q~Name von Firma22 123 08001234589 32~,
q~Name Firma3 12345 080012343 07~);

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

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/
<< |< 1 2 3 4 5 6 >| >> 52 Einträge, 6 Seiten



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