Schrift
[thread]3787[/thread]

Sortierung in Flatfile DB: Textbasierte BD

Leser: 1


<< >> 10 Einträge, 1 Seite
vaan
 2007-02-23 00:15
#35265 #35265
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Hi Leute,

wie kann ich denn das folgende Problem am besten lösen?

Ich habe ein Flatfile das wie folgt aufgebaut ist:

ID**SYSTEM**LINK**TEXT**TYPE

"ID" ist hierbei wie schon zu vermuten eine einmalige ID von 1 bis n.

Jetzt möchte ich eine "move_up" bzw "move_down" Funktionalität haben, also, ich bräuchte ein CGI, welches einen Datensatz mit einer bestimmten ID entweder nach oben oder nach unten schiebt in dem Flatfile.
Damit man die Reihenfolge der Datensätze nach Belieben ändern kann (immer schrittweise nach ober oder nach unten).

Ich bekomme aus einem HTML-file also die ID und die Info ob hoch oder runter, dann soll im CGI das Flatfile neu geordnet werden.

Hat da jemand schon was?

Das wäre echt genial, Danke schon mal im Voraus.
renee
 2007-02-23 09:49
#35266 #35266
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So etwas habe ich zwar noch nicht, aber das lässt sich relativ leicht realisieren...

Dafür ist das Modul CPAN:Tie::File ganz gut geeignet...

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Tie::File;

my $flat_file = '/path/to/flat.file';
tie my @array, 'Tie::File',$flat_file or die $!;
my $index = grep{$_->[0] =~ /^$id_from_form\*\*/}@array;
if($move eq 'up'){
my $elem = $array[$index];
$array[$index] = $array[$index-1];
$array[$index-1] = $elem;
}
else{
my $elem = $array[$index];
$array[$index] = $array[$index+1];
$array[$index-1] = $elem;
}
untie @array;


ungetestet!

Man kann auch mit <!--pod_f1--><a href="//perldoc.perl.org/functions/splice.html" target="_blank"><img alt="perldoc " src="/iB_html/non-cgi/Skin/SKIN-3/images/perldoc.gif" border="0"> <!--pod_f2-->-f splice<!--pod_f3--></a><!--pod_f4--> arbeiten...
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/
vaan
 2007-02-23 13:36
#35267 #35267
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Hi,
danke für die schnelle Antwort.
Ich hab das jetzt mal versucht in die Tat umzusetzten

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Tie::File;

my $id_from_form=3;
my $move="up";
my $flat_file = 'path/to/flat.file';

tie my @array, 'Tie::File',$flat_file or die $!;
my $index = grep{$_->[0] =~ /^$id_from_form\*\*/}@array;
if($move eq 'up'){
my $elem = $array[$index];
$array[$index] = $array[$index-1];
$array[$index-1] = $elem;
}
else{
my $elem = $array[$index];
$array[$index] = $array[$index+1];
$array[$index-1] = $elem;
}
untie @array;


so, nun hab ich der Variable $id_from_form den Wert 3 mitgegeben, und wenn ich den Code ausführe, dann geschieht nicht etwas mit dem Eintrag der die ID "3" hat sondern mit dem dritten Eintrag im Flatfile, ich würde aber gern den Eintrag mit der ID "3" gern verschieben.
Des weitweren wird der Datensatz nicht um eine Position im File nach oben oder untengeschoben, sondern irgendwie an den Anfang oder an das Ende und wenn ich für die Variable $move irgendwas anderes als "up" eintrage, dann wird wie gesagt, der Datensatz ans Ende geschoben und der zweite Datensatz im File wird irgend dupliziert und über den ersten geschrieben, sodass ich 2 mal den selben Eintrag im File habe.

Oder hab ich den Code vorher falsch verstanden?

Danke und Gruß
vaan
 2007-02-23 13:36
#35268 #35268
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Hi,
danke für die schnelle Antwort.
Ich hab das jetzt mal versucht in die Tat umzusetzten

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Tie::File;

my $id_from_form=3;
my $move="up";
my $flat_file = 'path/to/flat.file';

tie my @array, 'Tie::File',$flat_file or die $!;
my $index = grep{$_->[0] =~ /^$id_from_form\*\*/}@array;
if($move eq 'up'){
my $elem = $array[$index];
$array[$index] = $array[$index-1];
$array[$index-1] = $elem;
}
else{
my $elem = $array[$index];
$array[$index] = $array[$index+1];
$array[$index-1] = $elem;
}
untie @array;


so, nun hab ich der Variable $id_from_form den Wert 3 mitgegeben, und wenn ich den Code ausführe, dann geschieht nicht etwas mit dem Eintrag der die ID "3" hat sondern mit dem dritten Eintrag im Flatfile, ich würde aber gern den Eintrag mit der ID "3" gern verschieben.
Des weitweren wird der Datensatz nicht um eine Position im File nach oben oder untengeschoben, sondern irgendwie an den Anfang oder an das Ende und wenn ich für die Variable $move irgendwas anderes als "up" eintrage, dann wird wie gesagt, der Datensatz ans Ende geschoben und der zweite Datensatz im File wird irgend dupliziert und über den ersten geschrieben, sodass ich 2 mal den selben Eintrag im File habe.

Oder hab ich den Code vorher falsch verstanden?

Danke und Gruß
renee
 2007-02-23 13:40
#35269 #35269
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Sorry, da muss aus
Code: (dl )
grep{$_->[0] 
das hier gemacht werden
Code: (dl )
grep{$_
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/
vaan
 2007-02-23 13:57
#35270 #35270
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Nochmals hi :o)

hab mir das jetzt nochmal angekuckt, und zwar wenn ich die "up" Funtionalität übergebe werden immer nur die ersten 2 Einträge im File vertauscht (also der Eintrag mit der ID "1" und der mit der ID "2") unabhängig davon ob ich als ID z.B. die "3" oder "4" übergebe.

Und wenn ich dann den else Block ausführe wird wenn ich als ID die "1" übergebe, der erste eintrag gelöscht und der dritte irgendwie dupliziert dann sieht das Ganze wie folgt aus:

2**BW Report2*sdgsrtg**sdgtstg**sdgstrr**stgsrtg
3**test3**sdfg3**sdfgs3**sgdfg3**sdfgsdf3
3**test3**sdfg3**sdfgs3**sgdfg3**sdfgsdf3
4**test4**sdfg4**sdfgs4**sgdfg4**sdfgsdf4

An was liegt das denn? :o(

===
Modedit Gwendragon: Doppelpost gelöscht
===\n\n

<!--EDIT|GwenDragon|1172234261-->
nepos
 2007-02-23 14:16
#35271 #35271
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Einmal posten pro Antwort wäre btw auch ganz nett...
vaan
 2007-02-23 14:29
#35272 #35272
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Sorry, ich weiss.
Ich hab nen komischen DSL-Router daheim, der verursahct das Problem irgendwie.
renee
 2007-02-23 15:40
#35273 #35273
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier sollte soweit funktionieren:
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
#!/usr/bin/perl

use strict;
use warnings;
use Tie::File;

my $id_from_form=5;
my $move="up";
my $flat_file = './flat.file';

tie my @array, 'Tie::File',$flat_file or die $!;
chomp @array;
my ($index) = grep{$array[$_] =~ /^$id_from_form\*\*/}(0..$#array);
print $index,"\n";
if($move eq 'up'){
my $elem = $array[$index];
$array[$index] = $array[$index-1];
$array[$index-1] = $elem;
}
else{
my $elem = $array[$index];
$array[$index] = $array[$index+1];
$array[$index+1] = $elem;
}
$_ . "\n" for @array;
untie @array;
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/
vaan
 2007-02-23 16:23
#35274 #35274
User since
2006-11-21
17 Artikel
BenutzerIn
[default_avatar]
Suuuuuper!
Danke, funzt einwandfrei!
<< >> 10 Einträge, 1 Seite



View all threads created 2007-02-23 00:15.