User since
2004-12-27
7
Artikel
BenutzerIn
Hallo,
mein Name ist Patrick, ich bin 30 Jahre und hab mich gerade angemeldet da ich Eure Hilfe benötige.
Ich habe vor ca. 1,5 Jahren ein paar Sachen mit Perl gemacht und für mein jetziges Vorhaben scheint mir Perl prädestiniert zu sein.
Ich möchte Textfiles öffnen, bearbeiten und wieder abspeichern. Pro Zeile sind die Felder durch Kommas getrennt, haben aber eine unterschiedliche Anzahl an Feldern.
- Wie kann ich die Datei in arrays einlesen und überflüssige Felder entfernen?
- Eine Alternative wäre eine Tabelle zu erstellen, in denen falls Felder nicht verwendet sind, diese zu überspringen?
Beispiel für einen Dateiinhalt:
:CODE=1001234,Zustand=ok,Ursrpung=001,TYP=10
:CODE=1001236,Zustand=ok,Ursrpung=001,TYP=10
:CODE=1001237,Zustand=ok,Ursrpung=001,TYP=10
:CODE=1001238,Zustand=ok,Ursrpung=001,TYP=10
:CODE=1001134,Zustand=ok,Ursrpung=001,KENNUNG=AA
:CODE=1003236,Zustand=ok,Ursrpung=001,KENNUNG=AA
:CODE=1004237,Zustand=ok,Ursrpung=001,KENNUNG=AA
:CODE=1005238,Zustand=ok,Ursrpung=001,KENNUNG=AA
:CODE=0011101134,Zustand=ok,KENNUNG=AA
:CODE=0011103236,Zustand=ok,KENNUNG=BAA
:CODE=0011104237,Zustand=ok,KENNUNG=ADA
:CODE=0011105238,Zustand=ok,KENNUNG=VCS
Zu meiner ersten Frage strebe ich folgende Tabelle an:
CODE TYP
1001234 001
1001236 001
1001237 001
1001238 001
1001134 001
1003236 001
1004237 001
1005238 001
0011101134
0011103236
0011104237
0011105238
Zu meiner zweiten Frage strebe ich folgende Tabelle an:
CODE Zustand Ursprung TYP KENNUNG
1001234 ok 001 10
1001236 ok 001 10
1001237 ok 001 10
1001238 ok 001 10
1001134 ok 001 AA
1003236 ok 001 AA
1004237 ok 001 AA
1005238 ok 001 AA
0011101134 ok AA
0011103236 ok BAA
0011104237 ok ADA
0011105238 ok VCS
Tabelle zwei scheint mir eleganter zu sein. Könnt ihr mir einen Hinweis geben - bzw. wo kann ich hierzu weitere Infos bekommen? Habe den halben morgen gegoogelt aber nichts passendes gefunden. Was ich benötige ist wie bereits geschrieben einlesen von Textfiles, sortieren, suchen/ersetzen von Feldern bzw. deren Inhalt.
Viele Grüße,
Patrick
User since
2004-03-16
54
Artikel
BenutzerIn
Hi,
ich hab leider keine Zeit jetzt schnell was zu schreiben, aber was du dir angucken solltest ist die "split()" Funktion.
MfG
BungeeBug
User since
2003-12-04
285
Artikel
BenutzerIn
Hallo, und herzlich Willkommen!
Also eigentlich bin ich ja hier derjenige, der immer ganz viele Fragen stellt, aber Dein Vorhaben ist nicht schwer zu lösen...
Poste doch mal genauer was Du vor hast. Dann gibt es auch ein Code-Beispiel! Soll das Zeug nur wie in Deinem Beispiel eingelesen, verändert und wieder abgespeichert werden (für was auch immer) oder willst Du damit auch arbeiten? D. h. diese Daten irgendwie in einem Programm verfügbar haben? Wenn ich es recht verstehe, willst Du ja eigentlich nur diese CODE=, Zustand=, Ursrpung= usw. rauslöschen, und die Dinger nur durch ein Leerzeichn trennen... (?)
so als Gedanke:
*Daten in einen Hash von Hashes einlesen
*Daten durch eine foreach-Schleife jagen, dabei abfragen ob das Feld undef ist, ein bißchen formatieren und wieder in die Datei (über-)schreiben
Ist nicht schwer...
<center>Schönen Gruß, Alex
Mit dem Computer geht alles viel schneller - es dauert nur ein bißchen länger!</center>
User since
2004-12-27
7
Artikel
BenutzerIn
Hallo,
schonmal Danke dür die Antworten, SPLIT schau ich mir einmal an. Was ich möchte ist folgendes:
Ich habe vier verschiedene Dateien in denen Zahlen zB. Rufnummern in verschiedenen Formaten stehen einmal mit Vorwahl ohne 0, einmal getrennt von der eigentlichen Rufnummer etc. Die Rufnummern in Datei 1 sollen in den anderen drei Dateien gesucht werden und bei einem Treffer soll in einer Ausgabe Datei der Treffer mit "Treffer-Dateiname" ausgegeben werden.
Dies hab ich im ersten Posting nicht beschrieben, da ichja nicht die Gesamtlösung von Euch will ;-)
Gruß
Patrick
User since
2003-08-04
14371
Artikel
ModeratorIn
Ich würde es - wie Alex schon vorgeschlagen hat - in ein Hash speichern. Ungefähr so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Data::Dumper;
my $file = '/path/to/source.file';
my %hash;
open(SOURCE,"<$file") or die $!;
while(my $line = <SOURCE>){
my ($code) = $line =~ /CODE=([^,]+)/;
my ($zustand) = $line =~ /Zustand=([^,]+)/;
my ($kennung) = $line =~ /Kennung=([^,]+)/;
my ($typ) = $line =~ /Typ=([^,]+)/;
my ($ursprung) = $line =~ /Ursprung=([^,]+)/;
$hash{$code} = {zustand => $zustand,
kennung => $kennung,
typ => $typ,
ursprung => $ursprung};
}
close SOURCE;
print Dumper(\%hash); # zum Anschauen der Datenstruktur
User since
2003-12-04
285
Artikel
BenutzerIn
Hier eine andere (einfache) Idee, ohne Hash, Modul und regex, sondern nur mit Schleifen, den perlinternen Funktionen split, push und join und den gewünschten Arrays:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl
use strict;
use warnings;
my (@new_data, @old_data);
open (DATA, '<old_data.txt') || die $!;
while (<DATA>) { push @old_data, $_ };
close DATA;
foreach my $i (@old_data) {
my @pairs = split(/,/, $i);
my @singles;
foreach my $i (@pairs) {
my ($l, $r) = split(/=/, $i);
push @singles, $r;
}
my $family = join(' ', @singles);
push @new_data, $family;
}
open (DATA, '>new_data.txt') || die $!;
foreach (@new_data) { print DATA $_ }
close DATA;
\n\n
<!--EDIT|Alex|1104196021-->
<center>Schönen Gruß, Alex
Mit dem Computer geht alles viel schneller - es dauert nur ein bißchen länger!</center>
User since
2004-02-19
1750
Artikel
BenutzerIn
TIMTOWTDI ( aka there is more than one way to do it )
1. anforderung:
open DATAIN, '<old_data.txt' or die $!;
open DATAUOT 'new_data.txt' or die $!;
print DATAOUT /CODE=(\d*)/, " ", /Ursrpung=(\d*)/, "\n" while <DATAIN>;
close DATAIN;
close DATAOUT;
2. anforderung:
open DATAIN, '<old_data.txt' or die $!;
open DATAUOT 'new_data.txt' or die $!;
print DATAOUT join " ", /CODE=(\d*)/, /Zustand=(\w*)/, /Ursrpung=(\d*)/,
/TYP=(\d*)/, /KENNUNG=(\w*)/, "\n" while <DATAIN>;
close DATAIN;
close DATAOUT;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
User since
2003-12-04
285
Artikel
BenutzerIn
Meine obige Version, etwas kürzer:
my (@old_data, @new_data);
open (DATA, '<test\old_data.txt') || die $!;
while (<DATA>) { push (@old_data, $_) };
close DATA;
foreach (@old_data) {
my @line = /=(\w+)/g;
my $family = join(' ', @line);
push @new_data, $family;
};
foreach (@new_data) { print "$_\n"} # Wie bei renee, nur zum kucken...
Ansatz ist, dass es beliebig wieviele durch Komma getrennte unwichtig=wichtig Paare in einer Zeile sein dürfen...
@Taulmarill:
Habe mal gelesen, dass man einen DH auch zum lesen und schreiben öffnen kann. Á la
open (DATA, '+<test\old_data.txt') || die $!; Aber irgendwie geht das nicht. Er liest die Daten aber schreibt nicht zurück sondern löscht sie nur in der *.txt (?)
Edit: vertippt...\n\n
<!--EDIT|Alex|1104202229-->
<center>Schönen Gruß, Alex
Mit dem Computer geht alles viel schneller - es dauert nur ein bißchen länger!</center>
User since
2004-12-27
7
Artikel
BenutzerIn
Hallo,
vielen Dank für die Antworten, Taumarill's 2ter Ansatz passt ganz gut - hierzu nochmal eine Frage:
Was bewirkt bei print \d* und \w* bzw. wo würde ich dies unter www.perldoc.com finden, Perl ist zwar hier installiert jedoch keine Hilfe?
Gruß
Patrick
User since
2004-12-27
7
Artikel
BenutzerIn
Hallo nochmal,
ok \d* und \w* hab ich gefunden (d steht für digit character, w für word character, * für 0 oder mehr Treffer - soweit so gut.
Warum importiere ich jedoch immer nur ein Digit bei folgendem String?
Textfile:
:URSPRUNG=123,CODE=320317440,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=3203177290,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=320317770,VOL=0&1&2&3&4&5&6&7&8&9!
:URSPRUNG=123,CODE=32021883,VOL=3&4&5!
:URSPRUNG=123,CODE=4203204,VOL=4&5&6&7!
Perl Code:
open DATAIN, 'file.txt' or die $!;
open DATAOUT, '>outputfile.txt' or die $!;
print DATAOUT join "", /URSPRUNG=(\d*)/, /CODE=(\d*)/, /VOL=(\w*)/, "\n" while <DATAIN>;
close DATAIN;
close DATAOUT;
Ausgabe:
1233203174400
12332031772900
1233203177700
123320218833
12342032044
Erwartet hätte ich:
1233203174400&1&2&3&4&5&6&7&8&9
12332031772900&1&2&3&4&5&6&7&8&9
1233203177700&1&2&3&4&5&6&7&8&9
1233202188333&4&5
123420320444&5&6&7
Das & beschreibt ein Volumen dh. aus 1233202188333&4&5 sollen später drei Zeilen generiert werden:
123320218833
123320218834
123320218835
Viele Grüße,
Patrick
edit renee: ne Runde [code]-Tags spendiert. Die lieben wir so ;)\n\n
<!--EDIT|renee|1104229555-->