Schrift
[thread]7674[/thread]

Textdatei verarbeiten

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
zipster
 2006-02-03 18:48
#62605 #62605
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Hi,

ich bräuchte mal eure Hilfe bei einer RegEx. In solchen Sachen war ich noch nie so gut und ich hoffe das ich mein Problem mit eurer Hilfe lösen kann. ;)

Ich habe eine Datei die wie folgt aufgebaut ist.
(Ist leider ein wenig verschoben. Das macht das Forum so... :( )

Code: (dl )
1
2
3
4
5
6
7
....
Part     Value          Package     Library       Position (inch)       Orientation

C2       220µF          TT5D11L     rcl           (3.5 1.55)            R180
CON1     24V in         FLACHST_W2P ETG_con_flach (2 0.5)               R90
CON2                    F09HP       con-subd      (3.25 2.05)           R0
....


Ich möchte die Einträge nach der Kategorie sortieren und in einem Hash ablegen um sie später weiterverarbeiten zu können.

Jetzt zu meinem Problem. Der abstand zwischen den einzelnen Kategorien kann sich ändern je nachdem wie lang der Längste Eintrag darunter ist. Deswegen müßte man bei den Kategorien auslesen wie groß der Abstand ist und das dann auf die Sortierung anwenden... aber um ehrlich zu sein weiß ich nicht wie ich das lösen soll. Deswegen hoffe ich auf eure Hilfe...


Bis dann

Seri

edit pq: code-tags hinzugefügt\n\n

<!--EDIT|pq|1138995638-->
GwenDragon
 2006-02-03 19:39
#62606 #62606
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Wieviel Leerzeichen sind denn minimal zwischen den Einträgen?
zipster
 2006-02-03 19:42
#62607 #62607
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Ich denke mal der Name der Kategorie +1
Und die Kategorien sind fest. Das heißt "Part", "Value", "Package", "Library", "Position (inch)" und "Orientation"
GwenDragon
 2006-02-03 19:46
#62608 #62608
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Also zwei Leerzeichen oder ein Tab müssen schon mindestens dazwischen sein, sonst kann nicht so korrekt getrennt werden.
Soinst ist nicht wie bei [font=courier new]FLACHST_W2P ETG_con_flach (2 0.5)[/font] klar, was wohin gehört.
Menschen kapieren das eher, aber Programme brauchen Regeln ;)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/local/bin/perl

use strict;
use warnings;

<DATA>;
while (<DATA>) {
    chomp;
    next if /^$/;
    
    print join ("#", split /\s\s+/ ) ,"\n";
}

_ _ DATA _ _

Part     Value          Package     Library       Position (inch)       Orientation

C2       220µF          TT5D11L     rcl           (3.5 1.55)            R180
CON1     24V in         FLACHST_W2P ETG_con_flach (2 0.5)               R90
CON2                    F09HP       con-subd      (3.25 2.05)           R0


//EDIT: Das Forum hat das DATA-Statement gefressen.\n\n

<!--EDIT|GwenDragon|1139066079-->
GwenDragon
 2006-02-03 19:56
#62609 #62609
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Nee, ich habe in meinem Editor übersehen (typisch wenn eine keine feste Schriftbreite einstellt), dass bei CON2 ja nur ein Leeres Feld ist.
Sorry.

Sind da jetzt überall Werte drin, oder dürfen in den "Spalten" auch welche fehlen?\n\n

<!--EDIT|GwenDragon|1138989434-->
zipster
 2006-02-03 20:02
#62610 #62610
User since
2004-09-06
458 Artikel
BenutzerIn
[default_avatar]
Wow schnelle Anwort ;)
;)

Könntest du mir vieleicht auch erklären was die Zeile da macht?

Des weiteren überspringt der Snippsel ein wenn ein Betrag nicht ausgefüllt ist.
GwenDragon
 2006-02-03 20:47
#62611 #62611
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
Code: (dl )
chomp;
Zeilendezeichen löschen
Code: (dl )
    next if /^$/;
Falls Daten nur aus Zeilenanfang+Zeilenende bestehen dann nächster Datensatz
Code: (dl )
print join ("#", split /\s\s+/ ) ,"\n";

Datenzeile zuerst aufsplitten, mindestens zwei Whitespaces
#-Zeichen dazwischen schieben, nur zur Ansicht der besseren Trennung
Ausgeben und Zeilenwechsel anfügen



Meine Frage war: Darf jetzt auch eine "Spalte" leer sein?
pq
 2006-02-03 21:41
#62612 #62612
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=zipster,03.02.2006, 17:48]Ich habe eine Datei die wie folgt aufgebaut ist.
(Ist leider ein wenig verschoben. Das macht das Forum so... :( )[/quote]
wieso hast du keine code-tags benutzt?
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
renee
 2006-02-04 01:47
#62613 #62613
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code: (dl )
print join ("#", split /\s\s+/ ) ,"\n"; 


kann man auch als

Code: (dl )
print join ("#", split /\s{2,}/) ,"\n"; 


schreiben, was es - meiner Meinung nach - etwas besser verdeutlicht was gemacht wird...
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/
GwenDragon
 2006-02-04 18:00
#62614 #62614
User since
2005-01-17
14749 Artikel
Admin1
[Homepage]
user image
So könnte eine die Spaltenposition und -breite anhand der ersten Zeeile herausbekommen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
my @pos;

my $s = <DATA>;

my $lastpos = 0;
while ( $s =~ /\s\s\S/g ) {
# Position, Länge
push( @pos, $lastpos, pos( $s ) - $lastpos - 1 );
$lastpos = pos($s);
}

Später lassen sich die Werte dann mit index heraustrennen

Es geht garantiert noch eleganter. Aber das habe ich gerade nicht parat.\n\n

<!--EDIT|GwenDragon|1139068995-->
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-02-03 18:48.