Php script in perl übersetzen

Hallo zusammen,

ich hab aktuell ein php script was auf der kommandozeile ausgeführt wird.
nun würde ich das gleiche script gerne auch in perl haben um einen geschwindigkeitstest durchführen zu können.

kann jemand folgende php zeilen in perl umsetzen:

die function intodb sieht wie folgt aus:

 function intodb ($var) {
 $suchen = array("'","]","~","\\","[");
 $ersetzen = array(" ","Ü","ß","Ö","Ä");
 $var = trim($var); 
 $var = str\_replace($suchen,$ersetzen,$var);
 $var = mysql\_real\_escape\_string($var);
 return $var;
 }

Durchführen tut das Script folgendes.

Es wird eine csv Datei eingelesen die im ersten feld Steuerzeichen stehen hat.

alle Datensätze mit dem Steuerzeichen KO oder T sollen in jeweils eigenen csv dateien gespeichert werden

KO in voller länge

T soll in 5er Blöcke aufgeteilt werden.

Gruß & Danke
Phillip

Hallo zusammen,

ich hab aktuell ein php script was auf der kommandozeile
ausgeführt wird.
nun würde ich das gleiche script gerne auch in perl haben um
einen geschwindigkeitstest durchführen zu können.

kann jemand folgende php zeilen in perl umsetzen:

Direkt 1:1 umschreiben ist meist nicht so gut. Besser wäre es du würdest die problematik einmal genausten beschreiben, zeigen wie der input ausschaut, und wie der output ausschaut, und am besten noch eine testdatei mit input/output liefern damit man damit direkt arbeiten kann.

Eigentlich Relativ einfach :wink: aber doof zu erklären

File:

KO;;2527979;C;TGF;DFD;;C;;;;;;;;;;;;;H;;;
T;;2527979;2527979;;TGF;DFD;1;2;3;4;a;b;c;s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
X;;;;;;
Y;;;;;
DX;;;;;
A;;;;;

Diesen File möchte ich in 2 Files Aufteilen.
File 1:
Alle Zeilen die mit KO anfangen
Felder 1 und 2 Sollen nicht mit in den File.
Beginnen muss die Zeile mit NULL;

Soll Ausgabe:

NULL;2527979;C;TGF;DFD;;C;;;;;;;;;;;;;H;;;

File 2:
Alle Zeilen die mit T anfangen.
Es sollen immer Nur Feld 3, eine laufende nr und alle folgenden Felder in 5er blöcken
Beginnen muss die Zeile mit NULL;

Soll Ausgabe:

NULL;2527979;1;2527979;;TGF;DFD;1
NULL;2527979;2;2;3;4;a;b
NULL;2527979;3;c;s;;;

Alle Anderen Zeilen können einfach vergessen werden.

Ich hoffe das ist eine brauchbare Erklärung.

Gruß
Phillip

Ich hoffe das ist eine brauchbare Erklärung.

Ich glaube schon. Hier hast du etwas:

#!/usr/bin/perl
use strict;
use warnings;

open my $data, '', 'outko.txt' or die "Cannot open 'outko.txt': $!\n";
open my $out\_t, '\>', 'outt.txt' or die "Cannot open 'outt.txt': $!\n";

while ( my $line = ) {
 my @data = split /;/, $line;

 if ( $data[0] eq 'KO' ) {
 print $out\_ko 'NULL;', join(';', @data[2 .. $#data]), "\n";
 }
 elsif ( $data[0] eq 'T' ) {
 # Die ID auslesen
 my $id = $data[2];
 # Die ersten 3 Einträge entfernen
 splice @data, 0, 2;
 # Nur Elemente mit Inhalt nehmen
 my @data = grep /^.+$/, @data;

 my $laufende\_nummer = 0;
 while ( my @d = splice @data, 0, 5 ) {
 no warnings 'uninitialized';
 # Immer 5 Einträge
 $#d = 4;
 print $out\_t "NULL;$id;", join(';', $laufende\_nummer++, @d), "\n";
 }
 }
}

close $data;
close $out\_ko;
close $out\_t;

Nur Elemente mit Inhalt nehmen

my @data = grep /^.+$/, @data;

das grep wird wohl nur auf Unix/Linux gehen, oder muss bei Microsoft nachinstalliert werden :smile:

Ähh, nein.
Perl ruft keine Systembefehle auf. grep ist eine eingebaute Funktion in Perl. Das im übrigen auch mehr kann als der Systembefehl grep.

Wenn man also Perl auf Windows nutzt funktioniert es genauso.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

gut zu wissen , danke :smile:

nehm ich doch einfach das perl dafür :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich habe nochmal ein paar kleine verbesserungen vorgenommen:

#!/usr/bin/perl
use strict;
use warnings;

open my $data, '', 'outko.txt' or die "Cannot open 'outko.txt': $!\n";
open my $out\_t, '\>', 'outt.txt' or die "Cannot open 'outt.txt': $!\n";

while ( my $line = ) {
 chomp $line;
 my @data = split /;/, $line;

 if ( $data[0] eq 'KO' ) {
 print $out\_ko join ';', 'NULL', @data[2 .. $#data], "\n";
 }
 elsif ( $data[0] eq 'T' ) {
 # Die ID auslesen
 my $id = $data[2];
 # Die ersten 3 Einträge entfernen
 splice @data, 0, 2;
 # Nur Elemente mit Inhalt nehmen
 my @data = grep length $\_, @data;

 my $laufende\_nummer = 0;
 while ( my @d = splice @data, 0, 5 ) {
 # Immer auf 5 Einträge erhöhen
 $#d = 4;
 no warnings 'uninitialized';
 print $out\_t join ';', 'NULL', $id, $laufende\_nummer++, @d, "\n";
 }
 }
}

close $data;
close $out\_ko;
close $out\_t;
1 Like

also ich hab damit jetzt gerade mal einen benchmarktest gemacht.

top - 20:35:41 up 69 days, 23:22, 2 users, load average: 0.03, 0.23, 0.28
Tasks: 82 total, 1 running, 81 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 6231136k total, 3758464k used, 2472672k free, 119532k buffers
Swap: 5823520k total, 152k used, 5823368k free, 3433264k cached

pg@ubuntu:/var/www/test/csv$ perl /var/www/test/import.pl
PERL START: Thu Sep 27 20:36:04 2007
PERL ENDE : Thu Sep 27 20:36:58 2007
pg@ubuntu:/var/www/test/csv$ php /var/www/test/import\_test.php
PHP START: Thu, 27 Sep 2007 20:37:17 +0200
PHP ENDE : Thu, 27 Sep 2007 20:37:51 +0200
pg@ubuntu:/var/www/test/csv$ ls -l
total 6416
-rw-r--r-- 1 pg pg 1917112 2007-09-27 20:36 perl\_out\_ko.csv
-rw-r--r-- 1 pg pg 1351908 2007-09-27 20:36 perl\_out\_t.csv
-rw-r--r-- 1 pg pg 1917112 2007-09-27 20:37 php\_out\_ko.csv
-rw-r--r-- 1 pg pg 1351908 2007-09-27 20:37 php\_out\_t.csv
pg@ubuntu:/var/www/test/csv$

top - 20:38:16 up 69 days, 23:25, 2 users, load average: 0.03, 0.23, 0.28
Tasks: 82 total, 1 running, 81 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 6231136k total, 3758284k used, 2472852k free, 119784k buffers
Swap: 5823520k total, 152k used, 5823368k free, 3433284k cached

und ich muss sagen das perl dadrin deutlich schlechter abschneidet als php.

muss ich wohl doch gen c / c++ wandern.

Gruß
Phillip

Hallo,

Eigentlich Relativ einfach :wink: aber doof zu erklären
File:

Hast Du gut erkärt. Da es „Perl“ sein soll, sollte
man es auch wie „Perl“ aussehen lassen (und nicht
wie C oder PHP). Der Kick bei Perl sind die
PerlMonks und das CPAN, hier nutzen wir das CPAN:

 use strict;
 use warnings;
 use Text::CSV::Simple;
 use List::MoreUtils qw'natatime';

 # Eingabe
 my $parser = Text::CSV::Simple-\>new( {sep\_char=\>';' } );
 my @data = $parser-\>read\_file( 'testimp.csv' );

 # Ausgabearrays
 my @KO = map @$\_, grep $\_-\>[0] eq 'KO', @data;
 my @T = map @$\_, grep $\_-\>[0] eq 'T', @data;
 
 # Ausgabe 1 machen
 open my $ko\_file, '\>', 'testexp1.csv' or die "can't write $!";
 print $ko\_file join ';', 'NULL', @KO[2..$#KO];
 close $ko\_file;
 
 # Ausgabe 2 machen
 open my $t\_file, '\>', 'testexp2.csv' or die "can't write $!";
 my $slice = natatime 5, @T[3..$#T];
 my ($cnt, @part5) = 0;
 while( (@part5 = $slice-\>()) && grep length, @part5 ) {
 print $t\_file join(';', 'NULL', $T[2], ++$cnt, @part5), "\n"
 }
 close $t\_file;

Grüße

CMБ

Hallo Phillip,

also ich hab damit jetzt gerade mal einen benchmarktest
gemacht.

und ich muss sagen das perl dadrin deutlich schlechter
abschneidet als php.

Warte mal, das hättest Du dazu sagen sollen …

Du willst also *schnell* ca. 3-4 MB grosse
CSV-Dateien zerhauen? Danach muss man seine
Strategie ausrichten. Dann würde man direkt
in Text::CSV_XS arbeiten und keine „schön
aussehenden“ Feldkopierereien anstellen.

Kannst Du mal ein oder zwei input-csv irgend-
wo auflegen? Dann kann man das mal testen,
sonst ist das wie Trübfischerei:wink:

muss ich wohl doch gen c / c++ wandern.

Text::CSV_XS

Grüße

CMБ

Gruß
Phillip

Du willst also *schnell* ca. 3-4 MB grosse

300-400 MB aber sonst ja :wink:

CSV-Dateien zerhauen? Danach muss man seine
Strategie ausrichten. Dann würde man direkt
in Text::CSV_XS arbeiten und keine „schön
aussehenden“ Feldkopierereien anstellen.

was meinst du mit schön aussehenden feldkopierereien?

Kannst Du mal ein oder zwei input-csv irgend-
wo auflegen? Dann kann man das mal testen,
sonst ist das wie Trübfischerei:wink:

kann ich leider nicht,
aber es handelt sich im endefekt und den beispiel output den du zig mal hintereinander kopieren kannst.

Gruß
Phillip

Hallo,

Kannst Du mal ein oder zwei input-csv irgend-
wo auflegen? Dann kann man das mal testen,
sonst ist das wie Trübfischerei:wink:

kann ich leider nicht,
aber es handelt sich im endefekt und den beispiel output den
du zig mal hintereinander kopieren kannst.

a) Du hättest hier mal sagen können, was Du vorhin
im C-Brett gepostet hast :wink: (ich gucke da auch nicht
minütlich rein)

b) ich versuchs mal mit Deinem Tipp. 300-400MB?

Grüße

CMБ

Hallo,

Kannst Du mal ein oder zwei input-csv irgend-
wo auflegen? Dann kann man das mal testen,
sonst ist das wie Trübfischerei:wink:

kann ich leider nicht,
aber es handelt sich im endefekt und den beispiel output den
du zig mal hintereinander kopieren kannst.

a) Du hättest hier mal sagen können, was Du vorhin
im C-Brett gepostet hast :wink: (ich gucke da auch nicht
minütlich rein)

wusste ja nicht das es hier leute gibt die es lieber mit c++ machen als in perl :wink:

b) ich versuchs mal mit Deinem Tipp. 300-400MB?

300-400 MB sind für den geschwindigkeitstest ok.
im Echteinsatz gehen die dateien bis zu 1,5 GB hoch.

Gruß
Phillip

b) ich versuchs mal mit Deinem Tipp. 300-400MB?

300-400 MB sind für den geschwindigkeitstest ok.
im Echteinsatz gehen die dateien bis zu 1,5 GB hoch.

klingt als waere die tatsaechliche geschwindigkeit fast egal, weil du das sowieso asynchron loesen musst.

wie meinst du das ?

Gruß
Phillip

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

die funktion grep die der herr benutzt läd die gesamte Datei in den speicher und bearbeitet sie dann :smile: folglich bei zu grossen dateien legt es den rechner resourcen technisch lahm :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

die funktion grep die der herr benutzt läd die gesamte Datei
in den speicher und bearbeitet sie dann :smile: folglich bei zu
grossen dateien legt es den rechner resourcen technisch lahm

-)

Nein,
die Funktion grep lädt die Datei nicht komplett in den Arbeitsspeicher. Ich gehe mit grep ein Array durch.

Und in diesem Array sind nur die Felder der aktuellen zeile.

Ressourcentechnisch wird da gar nicht lahmgelegt!

Hallo,

a) Du hättest hier mal sagen können, was Du vorhin
im C-Brett gepostet hast :wink: (ich gucke da auch nicht
minütlich rein)

wusste ja nicht das es hier leute gibt die es lieber mit c++
machen als in perl :wink:

b) ich versuchs mal mit Deinem Tipp. 300-400MB?

300-400 MB sind für den geschwindigkeitstest ok.
im Echteinsatz gehen die dateien bis zu 1,5 GB hoch.

Bei GB-Files und Geschwindigkeit als Kriterium
wirst Du nicht um C herumkommen, entweder als
ganzes C-Programm (ich habe eben die Korrektur
geposted) oder als Inline C => { … } Block
in einem Perl-Programm.

Ansonsten muss man es in Perl auch zeilenweise
angehen (so wie David es schon begonnen hatte),
aber in der Zeile jeweils den String händisch
( SV_PV(perl_scalar, …) ) in C zerfasern.

Grüße

CMb

stimmt , sorry, war etwas vom weg abgekommen, dachte du nutzt es direkt auf die datei :smile:
hab einfach nicht nochmal dein code angeschaut :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]