Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12762[/thread]

Zeilen auffüllen bis feste Länge

Leser: 2


<< >> 10 Einträge, 1 Seite
leo11
 2008-11-14 19:49
#116279 #116279
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Hallo

ich habe eine Datei in der Zeilen unterschiedlicher Länge stehen. Bsp.:
123 wwwwww www www 999999www uui
2122222 2 f32fewfwv we
232
dswf432433 42 33

Die Zeilen haben bisher am Ende einen Zeilenunbruch. Ich möchte die Zeilen ab Ende des letzeten zeichens mit X ausfüllen, bis jede 100 Zeichen lang ist.

Ergebnis soll sein:
123 wwwwww www www 999999www uuiXXXXX
2122222 2 f32fewfwv weXXXXXXXXXXXXXXXXXX
232XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
dswf432433 42 33XXXXXXXXXXXXXXXXXXXXXXX

Dafür hab ich mir folgende Lösung ausgedacht:

Code (perl): (dl )
perl -wnl -e '$line = $_; $len = length($line); if( $len > 1) {for ($len..100) {$line =~ s/\r/X\r/g}; print $line }' test


Ist das eine gute Lösung?
Vor allem bei \r bin ich mir unsicher. Ich hätte lieber etwas unabhängig vom verwendeten Umbruch. Aber $ für Zeilenende geht nicht.?

Viele Grüße
leo11
LanX-
 2008-11-14 20:10
#116280 #116280
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
hi

mit

Code: (dl )
$hundert_x="x"x100;


und einfügen mit -f splice (*)
Code (perl): (dl )
splice $hundert_x,0,@str,@str;


sollts imho eleganter gehen, (ungestestet)

beachte bitte dass der 3.Parameter bei splice die anzahl der ersetzten Zeichen angibt,
scalar @str solte also stimmen.

vielleicht kann mans auch umdrehen ... oder ganz auf splice verzichten ... zig Möglichkeiten die besser sind als ne Schleife.

ach ja chompen solltest du schon!

EDIT:(*) gemeint war auch substr, siehe folgende Posts. Meine Anregungen wurden lobenswert umgesetzt! :)
Linuxer
 2008-11-14 20:13
#116281 #116281
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Hi,

Hier eine Lösung, die zwanghaft RegEx benutzt:
Code: (dl )
1
2
3
4
5
6
7
$ perl -wl

$str = 'abc';
$str =~ s/^(.+)$/sprintf("%s%s", $1, 'X'x(10-length($1)))/e;
print $str;

abcXXXXXXX


Hier eine Lösung, die ohne besondere Kommandos auskommt:

Code: (dl )
1
2
3
4
5
6
7
8
$ perl -wl
$str = 'abc';

$str .= 'X' x (10-length($str));

print $str;

abcXXXXXXX


[edit]einleitenden Text + 2. Lösung eingefügt[/edit]
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Linuxer
 2008-11-14 20:15
#116282 #116282
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Seit wann arbeitet splice() auf skalarer Ebene.
splice() ist für Arrays...

Eine Lösung mit substr() wäre dagegen denkbar...
Danke für die Anregung, LanX- ;))

Code: (dl )
1
2
3
4
5
6
7
8
9
10
$ perl -wl
my $x = 'X'x10;

my $a = 'abc';

substr( $x, 0, length($a), $a );

print $x;

abcXXXXXXX


[edit]Lösung eingebaut[/edit]
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
Gast Gast
 2008-11-14 22:47
#116283 #116283
Code (perl): (dl )
1
2
3
4
$length=100;
$string="abc123";

$string=substr($string.'X' x $length, 0, $length);
leo11
 2008-11-15 16:01
#116286 #116286
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Prima. Danke an euch alle.
leo11
 2008-11-15 19:35
#116294 #116294
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Ich muss nochmal nachhaken.

Das erste Ergebnis war wie folgt:
xxxxxqweqwe qwewe
xxxxxxxxxxxx332 234

D.h. das X wurde am Zeilenbeginn eingefügt. Ursache scheinen hier die Zeilenumbrüche zu sein. Mein Editor zeigt mir Windowsumbrüche an. Nach einigen Experimenten mit chomp und $/ führte nur folgendes zum gewünschten Ergebnis

Code (perl): (dl )
1
2
3
4
5
6
7
#!/usr/bin/perl -wlni
s/\n//;
$/="\r"; 
chomp; 
if (length($_)>1) {
    print substr($_."X" x 100, 0, 100)
}


Leider aber nur beim ersten Durchgang. Führe ich das Skript nochmal aus löscht es komplette Zeilen.Ich hab auch mal folgendes probiert:
Code (perl): (dl )
1
2
3
4
5
6
#!/usr/bin/perl -wln
$/="\r"; 
chomp; 
if (length($_)>1) {
    print substr($_."X" x 100, 0, 100)
}

Ergebnis: Die erste Zeile ist ok, dann kommt direkt die 2te. Sie ist auch ok, allerdings kommt dann eine Leerzeile. Alle darauf folgenden Zeilen sind auch ok, allerdings folgt immer eine Leerzeile.

Dann hab ich weiter getestet:
Code (perl): (dl )
1
2
3
4
5
6
#!/usr/bin/perl -wln
$/="\r\n"; 
chomp; 
if (length($_)>1) {
    print substr($_."X" x 100, 0, 100)
}

Ergebnis: Die erste Zeile wird direkt mit Hexcode 0d beendet, dann folgen die X, dann die restlichen Zeilen. Sie sind ok. Bsp.:
www e rere
xxxxxxxxxxxxx
3q3e rxxxxxxxxxxxxxxxxx
df dfe e343xxxxxxxxxxxxx
Der Hexcode Editor zeigt an, dass in der ersten Zeile noch 0d als Umbruch steht, während alle anderen 0a haben.

Vor dem Skript zeigt der Hexeditor überall als Zeilenende 0d0a an.
Mir ist nicht klar, wie ich das behebe.


(Nachträglich editiert)
leo11
 2008-11-15 21:35
#116296 #116296
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Ich habs:

Code (perl): (dl )
1
2
3
4
5
#!/usr/bin/perl -wni
s/\r\n//;
if (length>1) {
    print substr($_." " x 100, 0, 100)."\n"
}


D.h. ich hab -wni statt wlni benutzt und den Umbruch angehängt. Außerdem chomp weggelassen und den Windowsumburch über suchen und ersetzen entfernt. So funktioniert es auch, wenn ich dass Skript erneut auf dieselbe Datei anwende. Das Verhalten der anderen Varianten kann ich mir nicht erklären.?
Linuxer
 2008-11-15 21:47
#116297 #116297
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Woher kommen denn bitte Deine Daten?
Zeig mal auf, was genau Du tust.
Wie sieht das Skript aus? Wie rufst Du es auf?

Wenn Du Textdaten zwischen WinDOS, Unix und/oder Mac austauschst, musst Du auf die Zeilenumbrüche achten.
Bevor Du die Zeile anpasst, entfernst Du den Zeilenumbruch, bearbeitest die Zeile und fügst dann den Umbruch wieder an.

Hier ein Vorschlag (ungetestet):
# Skript: modDOS.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl
use strict;

while (<>) {
  # see perldoc perlvar
  local $/ = local $\ = "\015\012";

  # work and modify $_

  # print $_
  print;
}


# usage:
Code: (dl )
$ perl modDOS.pl < dostext.txt > modified_dos.txt
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
leo11
 2008-11-15 22:44
#116298 #116298
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
@Linuxer
Was du in Beitrag 8 siehst ist das Skript. Siehe Buch "Minimal Perl "

Und es wird aufgerufen über:
./skript datei

datei enthält die Daten...

Denke was Zeilenumbrüche angeht bin ich jetzt um einiges schlauer. (-:
<< >> 10 Einträge, 1 Seite



View all threads created 2008-11-14 19:49.