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
#!C:/Programme/Perl
use strict;
my $input='Input.csv';
my $output='Output.csv';
my $mapping='Input_mapping.csv';
my $zeileDaten;
my @arrayDaten;
my $inputDaten;
my @inputarray;
open MAPPING, "<$mapping" or die "Datei $mapping konnte nicht geöffnet werden";
while (<MAPPING>){
chomp;
#print "$_\n";
$zeileDaten ="$_\n";
@arrayDaten = split(/;/,$zeileDaten);
push(@arrayDaten,$zeileDaten);
}
close(MAPPING);
#open OUTPUT, ">$output" or die "Datei $output konnte nicht geöffnet werden";
open INPUT, "<$input" or die "Datei $input konnte nicht geöffnet werden";
while (<INPUT>){
$inputDaten ="$_\n";
@inputarray= split(/;/,inputDaten);
push(@inputarray,$inputDaten);
}
2014-05-23T14:54:26 sara456Das erste Feld in der Input Datei, hat die Länge 2, aber da es die Länge 5 haben soll, soll es vorne mit nullen befüllt werden.
Es soll mir die Länge der Numerischen Felder mit der Länge in der Mapping -Datei überprüfen und falls dies nicht gleich ist, diese vorne mit nullen befüllen. Ist es überhaupt machbar?
Als Output möchte ich
00012;000000;000000654;Test;12345;Test
00013;000000;000000265;Test;12345;Test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#!/usr/bin/perl use warnings; use strict; my @a = ("12;;654;Test;12345;Test", "13;;265;Test;12345;Test"); foreach my $line (@a) { chomp($line); my @b = split(";", $line); foreach my $i (@b) { if ($i eq "") { # Assigning a value to $i here changes @b too: $i = "000000"; } # isdigit?: if ($i !~ /\D/) { $i = sprintf("%06d", $i); } } print join(";", @b) . "\n"; }
2014-05-23T15:15:15 hlubenowAch so, wahrscheinlich kommt gleich jemand und sagt, Du solltest das Modul "Text::CSV" benutzen.
2014-05-23T15:20:02 Linuxer2014-05-23T15:15:15 hlubenowAch so, wahrscheinlich kommt gleich jemand und sagt, Du solltest das Modul "Text::CSV" benutzen.
Und? Wäre das so falsch?
2014-05-23T15:20:02 Linuxer2014-05-23T15:15:15 hlubenowAch so, wahrscheinlich kommt gleich jemand und sagt, Du solltest das Modul "Text::CSV" benutzen.
Und? Wäre das so falsch?
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
#!C:/Programme/Perl
use strict;
my $input='Input.csv';
my $output='Output.csv';
my $mapping='Input_mapping.csv';
my $zeileDaten;
my @arrayDaten;
my $inputDaten;
my @inputarray;
my $semikolon=';';
open MAPPING, "<$mapping" or die "Datei $mapping konnte nicht geöffnet werden";
open INPUT, "<$input" or die "Datei $input konnte nicht geöffnet werden";
open Output, ">$output" or die "Datei $output konnte nicht geöffnet werden";
while (<MAPPING>){
chomp;
#print "$_\n";
$zeileDaten ="$_\n";
push(@arrayDaten,$zeileDaten);
}
close(MAPPING);
while (<INPUT>){
chomp;
$inputDaten ="$_\n";
@inputarray=split(/;/,$inputDaten);
foreach $mapping( @arrayDaten ) {
my ($Stelle, $ZielStelle,$Laenge, $Typ) = split(/;/,$mapping);
if ($Stelle eq "!"){
print Output "$semikolon";
} else {
print Output "@inputarray[$Stelle]$semikolon";
print "@inputarray[$Stelle]$semikolon";
}
}
}
close(INPUT);
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
#!C:/Programme/Perl use strict; use warnings; my @mappingDaten = ( '0 0 5 Numerisch' , '1 1 6 Numerisch' , '2 2 9 Numerisch' , '3 3 14 Alphanumerisch' , '4 4 5 Numerisch' , '5 5 28 Alphanumerisch' # , '6 6 14 Alphanumerisch' es sind nur 6 Stellen! ); while (my $inputDaten = <DATA>){ chomp $inputDaten; my @inputarray = split /;/, $inputDaten; my @outputarray; foreach my $mapping (@mappingDaten) { my ($Stelle, $ZielStelle, $Laenge, $Typ) = split(/ /,$mapping); if ($Typ eq 'Numerisch') { $outputarray[$ZielStelle] = sprintf("%0" . $Laenge . "d", ($inputarray[$Stelle] or 0)); } elsif ($Typ eq 'Alphanumerisch') { $outputarray[$ZielStelle] = sprintf("% " . $Laenge . "s", ($inputarray[$Stelle] or '')); } } print join (";", @outputarray) . "\n"; } __DATA__ 12;;654;Test;12345;Test 13;;265;Test;12345;Test
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
#!C:/Programme/Perl
use strict;
my $input='Input.csv';
my $output='Output.csv';
my $mapping='Input_format.csv';
my $zeileDaten;
my @arrayDaten;
my $inputDaten;
my @inputarray;
my @outputarray;
open MAPPING, "<$mapping" or die "Datei $mapping konnte nicht geöffnet werden";
open INPUT, "<$input" or die "Datei $input konnte nicht geöffnet werden";
open OUTPUT, ">$output" or die "Datei $output konnte nicht geöffnet werden";
while (<MAPPING>){
chomp;
$zeileDaten ="$_\n";
push(@arrayDaten,$zeileDaten);
}
close (MAPPING);
while (<INPUT>){
chomp $inputDaten;
@inputarray = split (/;/, $inputDaten);
foreach $mapping (@arrayDaten) {
my ($Stelle, $ZielStelle, $Laenge, $Typ) = split(/;/,$mapping);
if ($Typ eq 'Numerisch') {
$outputarray[$ZielStelle] = sprintf("%0" . $Laenge . "d", ($inputarray[$Stelle] or 0));
} elsif ($Typ eq 'Alphanumerisch') {
$outputarray[$ZielStelle] = sprintf("% " . $Laenge . "s", ($inputarray[$Stelle] or ''));
}
}
print join (";", @outputarray) . "\n";
#print OUTPUT join (";", @outputarray) . "\n";
}
close (INPUT);
exit;
1
2
3
4
5
6
7
Stelle Länge Typ
1 5 Numerisch
2 6 Numerisch
3 9 Numerisch
4 14 Alphanumerisch
5 5 Numerisch
6 28 Alphanumerisch
if ($Typ eq 'Numerisch') { $outputarray[$ZielStelle] = sprintf("%0" . $Laenge . "d", ($inputarray[$Stelle] or 0)); } elsif ($Typ eq 'Alphanumerisch') { $outputarray[$ZielStelle] = sprintf("% " . $Laenge . "s", ($inputarray[$Stelle] or '')); }
sprintf ausgabe ("%0" . $Laenge. "d", $array[$Position]);)
sprintf ausgabe("% " . $Laenge. "s",$array[$Position] );
1
2
3
4
5
6
if ($Position >$Laenge){
substr($array[$Position], 0, index($array[$Position], $Laenge));
.......
}
Liege ich richtig ?