• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[ Solved ] File mit Perl bearbeiten

byron1778

Hacker
Hallo Forum,

ich moechte gerne folgendes File bearbeiten.


  • S0198CS0082 S0198CS0082 _SYSTEM_ 1 715 S0198CS0082 45 Mar 27 2006 3:58:39:690PM SDSAPEUR S&P Marketscope - Europe
    S0198CS0082 S0198CS0082 _SYSTEM_ 1 715 S0198CS0082 949 Mar 27 2006 3:58:39:690PM SDSMKRUSD SwapMarker
    S0198CS0082 S0198CS0082 _SYSTEM_ 1 715 S0198CS0082 35 Mar 27 2006 3:58:39:690PM SDTRENDSET Trendsetter Financial Services
    S0198CS0082 S0198CS0082 _SYSTEM_ 1 715 S0198CS0082 912 Jan 9 2007 3:08:56:766PM SDWMCOSPOT WM Co Spot
    S0198CS0083 _SYSTEM_ 1 715 S0198CS0083 2185 Oct 11 2004 10:35:31:030AM SDCANTORSWAP Cantor Fitzgerald Swapsight
    S0198CS0083 _SYSTEM_ 1 715 S0198CS0083 259 Oct 11 2004 10:35:31:030AM SDEMMKTSII Emerging Markets International Insider
    S0198CS0083 _SYSTEM_ 1 715 S0198CS0083 210 Oct 11 2004 10:35:31:030AM SDIDEACCYDER I.D.E.A. Currency Derivative
    S0198CS0083 _SYSTEM_ 1 715 S0198CS0083 1056 Oct 11 2004 10:35:31:030AM SDIFRALL All IFR Services
    root User for Testprogramms _SYSTEM_ 2 rts root 35 Mar 9 2004 4:37:31:533PM SDTRENDSET Trendsetter Financial Services
    root User for Testprogramms _SYSTEM_ 2 rts root 912 Jan 9 2007 5:28:03:096PM SDWMCOSPOT WM Co Spot
    sailfish Sailfish - Server-User K+ 2 660 sailfish 2185 Mar 9 2004 4:37:31:533PM SDCANTORSWAP Cantor Fitzgerald Swapsight
    sailfish Sailfish - Server-User K+ 2 660 sailfish 259 Mar 9 2004 4:37:31:533PM SDEMMKTSII Emerging Markets International Insider
    sailfish Sailfish - Server-User K+ 2 660 sailfish 210 Mar 9 2004 4:37:31:533PM SDIDEACCYDER I.D.E.A. Currency Derivative
    sailfish Sailfish - Server-User K+ 2 660 sailfish 187 Mar 9 2004 4:37:31:533PM SDIIBOND International Insider - Bondwatch
    60_MCA_IDN IDN Map Application _SYSTEM_ 1 rts 60_MCA_IDN 949 Jun 3 2004 1:03:38:143PM SDSMKRUSD SwapMarker
    67_ITEM_REQUIREMENT Erstebank Internal Application _SYSTEM_ 1 rts 67_ITEM_REQUIREMENT 2185 Mar 9 2004 4:37:31:533PM SDCANTORSWAP Cantor Fitzgerald Swapsight
    67_ITEM_REQUIREMENT Erstebank Internal

Dabei braeuchte ich die Eintraege der Uhrzeit.
Also zB: 10:35:00:47AM

Mir geht es einzig und allein darum, dass ich die Uhrzeit und AM od PM bekomme und diese Uhrzeit dann in ein anderes Format umwandle.
Leider ist die Uhrzeit aber nicht immer in der selben Spalte, sonst koennte ich es ganz leicht auslesen.
Hab mir ueberlegt, ob ich es nicht mit rindex, index od substr od so hinbekomme, damit ich die Position festellen kann und dann mir das Ergebnis ausgebe.
Aber dieses fuehrt leider auch nicht zum Ergebnis.
Weiss vll. jemand eine bessere Moeglichkeit?

Danke vielmals.
 

regexer

Advanced Hacker
wenn sonst gar nichts hilft, funktioniert evtl. folgende regexp (bitte eventuell die Anzahl der Leerzeichen anpassen)
Code:
while (<>) {
  if (/((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d? \d{4}) (\d\d?:\d\d:\d\d:\d{3}[AP]M)/)  {
    print "Datum: $1 Uhrzeit: $3\n";
  }
}
 
OP
B

byron1778

Hacker
Hallo,

ich habe gerade leider feststellen muessen, dass das 9 Feld immer das Datum und die Uhrzeit ist.

Hilft mir aber personelich noch nicht soviel weiter, da das Monat noch auf Zahlen umgeaendert werden muss und die Uhrzeit auf zb: 7:33 verkuerzt werden soll.

Am Ende sollte alles wieder ins File zurueckgespielt werden bedeutet, wenn die Zeile folgendermasen geheissen hat:

xxx xxx xxx Mar 9 2004 4:37:31:555PM xxx xxx xxx

sollte am Ende xxx xxx xxx 05/05/2004 4:37 stehen.

Wenn jemand noch eine Idee hat, danke vielmals.

Versuche selber gerade das Array mit split und dergleichen aufmachen, bislang ohne Erfolg.
 
OP
B

byron1778

Hacker
Ich konnte mir folgendes zusammenbauen ( bitte nicht boese sein ueber den grauslichen Code ).

Code:
#!/bin/perl -w

open(FILE, "<unused_spec5.bcp");

$charAM="AM";

while ( <FILE> )        {
        $aktuelle_zeile = $_;

        $posanfangvonam = index($aktuelle_zeile, $charAM);
        if ( $posanfangvonam !=  "-1" ) {

        $posende = $posanfangvonam - 24;        #24 wir gehen rueckwaerts die liste

        $ergebnis = substr($aktuelle_zeile, $posende, 3);#3 wir gehen vorwaerts die liste

        #$ergebnis = substr($aktuelle_zeile, $posende, 10);

        if ( $ergebnis eq "Oct" )       {
                $ergebnisjahr = substr($aktuelle_zeile, $posende+7, 4);
                $ergebnistag = substr($aktuelle_zeile, $posende+4, 2);
                #$ergebnismonat = substr($aktuelle_zeile, $posende, 3);
        #print "$ergebnistag\n";
        #print "$ergebnisjahr\n";
        #print "$ergebnismonat\n";
#       print "$ergebnistag/10/$ergebnisjahr" . "\n";
        push(@array1, "$ergebnistag/10/$ergebnisjahr");

                                        }
                                        }
}

@array = <FILE>;
close(FILE);

@LIST = splice(@array, 7, 14, @array1);

foreach ( @LIST )       {

print $_ . "\n";;

}

Am Ende wollte ich ihm das Ergebnis in das File zurueckspielen, genau an die Position Nummer 7, dort wo das Datum und die Uhrzeit liegt.
Leider aber funktioniert es nicht?
 

abgdf

Guru
Hi,

nimm doch den Code von notoxp und fang mal so an:
Code:
#!/usr/bin/perl

use warnings;
use strict;

open(FILE, "<unused_spec5.bcp");
my @a = <FILE>;
close(FILE);

foreach(@a)
{
    if (/((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d? \d{4}) (\d\d?:\d\d:\d\d:\d{3}[AP]M)/)
        {
            print "Datum: $1 Uhrzeit: $3\n";
        }
}
Dann lies und arbeite mit
Code:
perldoc -f time
perldoc -f localtime
perldoc -f gmtime
Bei dem AM/PM könnte vielleicht etwas Handarbeit nötig sein.
Das Ersetzen geht dann mit
Code:
$line =~ s/war/soll/g
Ist schon etwas Arbeit ...

Gruß
 

Aqualung

Newbie
in bash:

Code:
while read line; do 
    oldat=$(echo "$line" |sed  "s/[A-Z][a-z][a-z] [0-9]* [0-9][0-9][0-9][0-9] [0-9]*\:[0-9]*\:[0-9]*/§&§/" | cut -d§ -f2);
    nwdat=$(date -d "$oldat" +"%d\/%m\/%y %H:%M" );
    echo "$line" |sed  "s/[A-Z][a-z][a-z] [0-9]* [0-9][0-9][0-9][0-9] [0-9]*\:[0-9]*\:[0-9]*:[0-9]*[AP]M/$nwdat/"; 
done  < testfile

Übersetzung in perl überlasse ich dem geneigten Leser ...

HTH Aqualung
 

abgdf

Guru
Na gut, weil ihr's seid:
Code:
#!/usr/bin/perl

use warnings;
use strict;

my @mo = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );

open(FILE, "<unused_spec5.bcp");
my @a = <FILE>;
close(FILE);

my $new;

foreach(@a)
{
    if (/((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d? \d{4}) (\d\d?:\d\d:\d\d:\d{3}[AP]M)/)
    {
        $new = &getDate($1) . " " . &getTime($3);
        $_ =~ s/$1 $3//;
        chomp($_);
        $_ .= " $new";
    }
    print "$_\n";
}

sub getDate
{
    my @a = split(" ", shift());
    my $i;

    my $b = "$a[1]/";

    for($i = 0; $i <= $#mo; $i++)
    {
        if($a[0] eq $mo[$i])
        {
            $b .= ($i + 1);
        }
    }

    $b .= "/$a[2]";

    return $b;
}


sub getTime
{
    my @a = split(":", shift());

    if($a[3] =~ m/PM/)
    {
        $a[0] += 12;
    }

    return "$a[0]:$a[1]:$a[2]";
}
... ist aber an der Obergrenze :roll: ...

Gruß
 

abgdf

Guru
@notoxp: Mit Deinem Lösungsansatz ist alles in Ordnung. Funktioniert prima. Ich habe ihn in meinem Skript ja auch verwendet. Man muß dann aber noch das Datum umformatieren, denn es ist in der Ausgangsdatei in einem vermaledeiten Nicht-standard-format :roll: ...

Übrigens: Fällt das unter Doppelposting ? :

http://forum.perl.de/bb/file-bearbeiten-und-eintraege-aendern-t4887.html

Gruß
 

regexer

Advanced Hacker
abgdf schrieb:
Übrigens: Fällt das unter Doppelposting ? :

http://forum.perl.de/bb/file-bearbeiten-und-eintraege-aendern-t4887.html
Da es unter http://de.wikipedia.org/wiki/Doppelposting keinen Eintrag gibt, kannst du ja selbst eine Definition festlegen :wink:
 

abgdf

Guru
Tatsächlich, da gibt es keinen wiki-Eintrag :shock:. Aber immerhin:

http://de.wikipedia.org/wiki/Crossposting

und auch z.B.

http://www.pc-forum24.de/pc-forum24-de/1291-multipostings-crosspostings.html

Wie auch immer, ich finde byron1778 könnte sich inzwischen gern mal wieder zum eigentlichen Thema seines Threads melden.
 
Oben