Schrift
[thread]6425[/thread]

Separator mittels Variable???



<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2004-07-23 11:20
#84798 #84798
Hallo an alle,

ich habe mir eine Funktion geschrieben mit der ich eine Textdatei auslesen und in einer ARRAY Variable spreicher:
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
sub   fill_table()
{
my $datei = $_[0]; # Dateiname
my $src_path = $_[1]; # Pfad zur Datei
my $delimiter = $_[2]; # Separator
my $header = $_[3];


open (IFILE, "< $src_path$datei") or die "can't open $0: $!\n";

$z=0;
while(my $BomLine = <IFILE>)
{
$z++;
my @Bom = split(/\$delimiter/, $BomLine);
$spalten= @Bom;
$cols=$spalten;

for (0..$spalten)
{
$col=$_;
$col=$col+1;
$arrayVar->{"$z,$col"} = "$Bom[$_]";
}
}
}


Mein Problem ist folgendes:

Gebe ich den Separator über eine Variable an diese Funktion gehts nicht:

Code: (dl )
&fill_table('test.txt','',"|",'1');


Wenn ich aber direkt in die Split Funktion den Separator reinschreibe gehts:


Code: (dl )
          my @Bom = split(/\s+/, $BomLine);


Was mache ich da falsch?

Danke für eure Hilfe

Andreas
renee
 2004-07-23 11:23
#84799 #84799
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
mach mal aus \$delimiter $delimiter (das Backslash weg)...
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
 2004-07-23 11:27
#84800 #84800
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das hier funktioniert bei mir:
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 $delim = '\|';
my $string = qq~test|dies|ist|ein~;

fill_table($string,"",$delim);

sub fill_table
{
my $string = $_[0]; # Dateiname
my $src_path = $_[1]; # Pfad zur Datei
my $delimiter = $_[2]; # Separator

my @Bom = split(/$delimiter/, $string);
print $_,"\n" for(@Bom);
}
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
 2004-07-23 11:33
#84801 #84801
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein Code etwas optimiert:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub   fill_table{ # die runden Klammern weg, weil das Prototyping ist!
 my ($datei,$src_path,$delimiter,$header) = @_;
 
 open (IFILE, "< $src_path$datei") or die "can't open $src_path$datei: $!\n"; # in $0 steht der Skriptname
   my $z = 0;
   while(my $BomLine = <IFILE>){
        $z++;
        my @Bom = split(/\Q$delimiter/, $BomLine); # benutz das \Q!!!        
        for (0..(scalar(@Bom) -1)){
           $arrayVar->{$z.','.($_ + 1)} = $Bom[$_];
        }
   }
   close IFILE; # Filehandle schließen - das hast Du komplett vergessen!
}


Aufruf könnte dann so aussehen:
Code: (dl )
1
2
3
4
5
6
my $delim = '|';
my $file = 'test.txt';
my $path = '/path/';
my $head = 'irgendwas';

fill_table($file,$path,$delim,$head);
\n\n

<!--EDIT|renee|1090568318-->
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/
Andreas
 2004-07-23 12:20
#84802 #84802
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Vilen Dank schon mal für deine Hilfe,

habe den Code eingefügt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sub   fill_table()
{
my ($datei,$src_path,$delimiter,$header) = @_;

open (IFILE, "< $src_path$datei") or die "can't open $src_path$datei: $!\n"; # in $0 steht der Skriptname
my $z = 0;
while(my $BomLine = <IFILE>){
$z++;
my @Bom = split(/\Q$delimiter/, $BomLine); # benutz das \Q!!!
$cols= @Bom;
for (0..(scalar(@Bom) -1)){
$arrayVar->{$z.','.($_ + 1)} = $Bom[$_];
}
}
1 while <IFILE>;
$zeilen=$.;

close IFILE; # Filehandle schließen - das hast Du komplett vergessen!
}


Mit | funz das auch soweit:

Code: (dl )
1
2
3
4
5
6
my $delim = '|';
my $file = 'test.txt';
my $path = '';
my $head = 'irgendwas';

fill_table($file,$path,$delim,$head);

Nur wenn ich als separator eine beliebige Anzahl an Leerstellen habe also s+ funz es nicht:

Code: (dl )
1
2
3
4
5
6
my $delim = 's+';
my $file = 'test2.txt';
my $path = '';
my $head = 'irgendwas';

fill_table($file,$path,$delim,$head);


Hast du eine Ahnung warum nicht?
pq
 2004-07-23 12:40
#84803 #84803
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
naja, du musst dich entscheiden, ob du als argument an fill_table() eine regex
oder einen string übergibst.
wenn du einen beliebigen string übergeben willst, der auch sonderzeichen
enthalten könnte, z.B. $delimiter = '_|_';, dann musst du den
backslash in der funktion escapen, und zwar mit m/\Q$delimiter\E/.
willst du allerdings eine regex übergeben, also sowas wie \s+, dann
musst du in dem fall sagen: $delimiter = '\s+';, damit in der
funktion die regex auch so ankommt, wie du gedacht hast. wenn du sie so:
"\s+" übergibst, bleibt in der funktion nur noch "s+" übrig.
und in der funktion darfst du $delimiter dann nicht escapen.\n\n

<!--EDIT|pq|1090572144-->
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
Relais
 2004-07-23 12:41
#84804 #84804
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
An dieser Stelle fehlt der Backslash: "\s+"
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Ronnie
 2004-07-23 12:43
#84805 #84805
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Probier es mal so:
Code: (dl )
my $delimiter = qr/\s+/;

Habe es nicht getestet.
renee
 2004-07-23 12:51
#84806 #84806
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dann mach es so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sub   fill_table{ 
my ($datei,$src_path,$delimiter,$header,$type) = @_;

open (IFILE, "< $src_path$datei") or die "can't open $src_path$datei: $!\n";
my $z = 0;
while(my $BomLine = <IFILE>){
$z++;
my @Bom = ();
if($type eq 'RegEx'){
@Bom = split(/$delimiter/, $BomLine);
}
else{
@Bom = split(/\Q$delimiter/, $BomLine);
}
for (0..(scalar(@Bom) -1)){
$arrayVar->{$z.','.($_ + 1)} = $Bom[$_];
}
}
close IFILE;
}


Und die möglichen Aufrufe: (RegEx)
Code: (dl )
1
2
3
4
5
6
7
my $delim = '\s+'; # wichtig: Hochkommas benutzen!
my $file = 'test2.txt';
my $path = '';
my $head = 'irgendwas';
my $type = 'RegEx';

fill_table($file,$path,$delim,$head,$type);


bzw. (keine Regex, sondern normaler String):
Code: (dl )
1
2
3
4
5
6
7
my $delim = '|';
my $file = 'test2.txt';
my $path = '';
my $head = 'irgendwas';
my $type = 'Char';

fill_table($file,$path,$delim,$head,$type);
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/
Andreas
 2004-07-23 13:11
#84807 #84807
User since
2003-09-24
111 Artikel
BenutzerIn
[default_avatar]
Danke Renee,

funktioniert super :-))
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-07-23 11:20.