Schrift
[thread]7957[/thread]

Ausschneiden & Sortieren



<< >> 8 Einträge, 1 Seite
thomase
 2006-05-09 15:57
#65799 #65799
User since
2006-05-09
4 Artikel
BenutzerIn
[default_avatar]
Hallo liebe Community,

ich beschäftige mich erst seit kurzem mit Perl. Habe 2 Tage lang versucht ein simples Script zu schreiben, natürlich ohne Erfolg. Die Recherchen hier im Forum oder per Google brachten mich nicht weiter.

Hier mein Problem:

Ich möchte aus vielen Dateien mit der Endung .rel Daten ausschneiden und in eine einzige Textdatei ausgeben.

Die Dateien haben immer folgenden Inhalt:
Feld1: Testtext1
Feld2: ...
.
.
.
.
Feld 13: Testtext 13
Testtext 14
Testtext 15
Feld 14 usw...

Ich möchte von diesen Dateien immer die erste Zeile also Feld 1 (Einzeiler) und das Feld 14 (Einzeiler oder Mehrzeiler) ausschneiden und diese dann nach Feld 1 sortieren.

Die Aufgabenstellung hört sich simpel an und ich denke wenn ich über entsprechendes Knowhow verfügen würde, es auch innerhalb von 5 Minuten fertig hätte, aber dem ist nicht so.

Über Hilfe wäre ich sehr dankbar.

Thomas

Mein System: Windows XP mit Active Perl 5.8...
renee
 2006-05-09 16:22
#65800 #65800
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das koennte ungefaehr so gehen:
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
27
28
29
30
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $dir = '/path/to/directory';
{
opendir(DIR,$dir) or die $!;
my @files = grep{$_ !~ /\.?\./}readdir(DIR);
closedir DIR;

local $/ = "\nFeld";
my @array;
for my $file(@files){
my %hash;
open(my $fh,'<',$file) or die $!;
while(my $line = <$fh>){
chomp $line;
my ($nr) = $line =~ /^\s*(\d+)/;
$hash{$nr} = $line;
}
close $fh;
push @array,\%hash;
}

@array = sort{$a->{1} cmp $b->{1}}@array;
}

print Dumper(\@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/
thomase
 2006-05-09 17:07
#65801 #65801
User since
2006-05-09
4 Artikel
BenutzerIn
[default_avatar]
Hallo renee,

vielen Dank für die schnelle Antwort.

Leider gibt es das Modul Data::Dumper nicht für Windows "Active Perl" sondern nur Data-Dumper-Simple. Ist das Modul kompatibel?

Ich habe das Script umgewandelt und folgendes ersetzt

use Data::Dumper::Simple;

Ohne Erfolg.

Gruß
Thomas
Taulmarill
 2006-05-09 17:58
#65802 #65802
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hu?!? Data::Dumper ist ein core-modul. es sollte also bei deinem perl bereits dabei gewesen sein.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
bo
 2006-05-09 18:02
#65803 #65803
User since
2006-05-09
76 Artikel
BenutzerIn
[default_avatar]
Doch, Data::Dumper gibt es...
Ich habe ActivePerl 5.8.3 und da ist das Modul dabei. Es sollte also funktionieren.
thomase
 2006-05-09 18:17
#65804 #65804
User since
2006-05-09
4 Artikel
BenutzerIn
[default_avatar]
Hallo!

Ihr habt recht es ist installiert. Bloss bei dem Aufruf von ppm wird mir folgendes angezeigt:

C:\>ppm
PPM - Programmer's Package Manager version 3.4.
Copyright &copy; 2001 ActiveState Software Inc. All Rights Reserved.

Entering interactive shell. Using Term::ReadLine::Perl as readline library.

Type 'help' to get started.

ppm> search dumper
Searching in Active Repositories
1. CGI-Session-Serialize-DataDumper [1.5] CGI-Session-Serialize-DataDumper
2. Data-Dumper-Simple [0.11] Data-Dumper-Simple
3. Data-Hexdumper [1.2] Data-Hexdumper
4. Data-HTMLDumper [0.08] Data-HTMLDumper
5. Data-Tabular-Dumper [0.02] Data-Tabular-Dumper
6. Data-TreeDumper-Renderer-ASCII [0.03] Data-TreeDumper-Renderer-ASCII
7. Data-TreeDumper-Renderer-DHTML [0.05] Data-TreeDumper-Renderer-DHTML
8. HTML-Template-Dumper [0.1] HTML-Template-Dumper
9. XML-Dumper [0.81] XML-Dumper
ppm>

C:\>perl -version

This is perl, v5.8.8 built for MSWin32-x86-multi-thread
(with 25 registered patches, see perl -V for more detail)

Copyright 1987-2006, Larry Wall

Binary build 817 [257965] provided by ActiveState http://www.ActiveState.com
Built Mar 20 2006 17:54:25

Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

C:\Perl\lib\Data\Dumper.pm -> Datei ist vorhanden

D:\Test3>test.pl
Global symbol "@array" requires explicit package name at D:\Test3\Test.pl line 3
0.
Execution of D:\Test3\Test.pl aborted due to compilation errors.

D:\Test3>

Bei dem Aufruf vom Script und nach der Anfrage mit dem Script bin ich davon ausgegangen, dass die Libary fehlt.

Wenn ich mir die Fehlermeldung jetzt nocheinmal anschaue, gehe ich davon aus, daß das Script noch geändert werden muß??? Nur wie???

Danke für eure Unterstützung

Thomas
renee
 2006-05-09 18:23
#65805 #65805
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Mein Fehler! Die letzten Zeilen müssen so heißen:
Code: (dl )
1
2
3
  @array = sort{$a->{1} cmp $b->{1}}@array;
print Dumper(\@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/
thomase
 2006-05-09 18:37
#65806 #65806
User since
2006-05-09
4 Artikel
BenutzerIn
[default_avatar]
Hallo Renee,

das Script läuft jetzt ohne Fehler durch, als Ausgabe bekomme ich:
D:\Test3>test.pl
$VAR1 = [];

Das Script habe ich bei mir mit dem Directory angepasst und es sieht so aus:
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
27
28
29
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $dir = 'd:\\test';
{
opendir(DIR,$dir) or die $!;
my @files = grep{$_ !~ /\.?\./}readdir(DIR);
closedir DIR;

local $/ = "\nFeld";
my @array;
for my $file(@files){
  my %hash;
  open(my $fh,'<',$file) or die $!;
  while(my $line = <$fh>){
    chomp $line;
    my ($nr) = $line =~ /^\s*(\d+)/;
    $hash{$nr} = $line;
  }
  close $fh;
  push @array,\%hash;
}

@array = sort{$a->{1} cmp $b->{1}}@array;
print Dumper(\@array);
}


Als Testdatei habe ich dieses Listing genommen:
Feld1: Testtext1
Feld2: ...
.
.
.
.
Feld 13: Testtext 13
Testtext 14
Testtext 15
Feld 14 usw...

Irgendwelche Ideen? Und nochmals Danke an alle für eure gute und schnelle Unterstützung

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

<!--EDIT|thomase|1147203997-->
<< >> 8 Einträge, 1 Seite



View all threads created 2006-05-09 15:57.