Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

txt nach csv anhand spalten

13 views
Skip to first unread message

Christoph Rehers

unread,
Jul 29, 2004, 5:56:31 AM7/29/04
to
hallo ng,
ich babe ein problem beim konvertieren einer txt datei in csv/ssv.
die txt besteht aus mehreren spalten und variabler zeilenlaenge.
bsp:
---- filename.txt -----------------------
time no. address protocol lenght
...
12:34 43 192.168.0.1 TCP 64
12:44 44 192.168.0.5 IPX SAP 92
12:46 45 192.168.0.1 TCP 32
...
-----------------------------------------

nun ersetze ich alle leerzeichen durch ';' nud benenne die datei in
filename.csv um, damit ich mit der fkt fgetscsv() die daten in ein
2dim array reinschreiben kann.

---- filename.csv -----------------------
time;no.;address;protocol;lenght
...
12:34;43;192.168.0.1;TCP;64
12:44;44;192.168.0.5;IPX;SAP;92
12:46;45;192.168.0.1;TCP;32
...
-----------------------------------------
funzt so auch so alles wunderbar.
problem:
in der spalte protocol koennen strings vorkommen, die ein leerzeichen
enthalten, hier: "IPX SAP" (es existieren noch weitere variationen mit
leerzeichen im namen). diese leerzeichen sollen natuerlich im string
enthalten bleiben.
nun die ueberlegung, ob es ne loesung gibt, die mir die semikolons
anhand der SPALTEN setzt. also d.h. das erste semikolon wird an der
horizontalen stelle zwischen 'e' (von time) und 'n' (von no) gesetzt,
usw.
ich hoffe, jemand kann mir durch ne idee zu einer loesung verhelfen -
im voraus danke.
viele gruesse,
christoph

Nobody

unread,
Jul 30, 2004, 4:40:00 AM7/30/04
to
"Christoph Rehers" <s_h...@gmx.de> schrieb im Newsbeitrag
news:5ca9dd56.04072...@posting.google.com...


Mit einem preg_replace kannst es besser machen:

<?php
$content = implode('', file('filename.txt'));
$content_csv =
preg_replace('/^([0-9]{1,2}:[0-9]{1,2})([ ]+)([0-9]+)([ ]+)([0-9]{1,3}\.[0-9
]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})([ ]+)([a-zA-Z ]+?)([ ]+)([0-9]+)$/',
'$1;$3;$5;$7;$9', $content);

echo $content_csv;
?>

--
-------------------------------------------------------
Try this: SCA the Smart Class Archive for PHP
http://www.project-sca.org
-------------------------------------------------------


Christoph Rehers

unread,
Aug 10, 2004, 4:46:45 AM8/10/04
to
>
> Mit einem preg_replace kannst es besser machen:
>
> <?php
> $content = implode('', file('filename.txt'));
> $content_csv =
> preg_replace('/^([0-9]{1,2}:[0-9]{1,2})([ ]+)([0-9]+)([ ]+)([0-9]{1,3}\.[0-9
> ]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})([ ]+)([a-zA-Z ]+?)([ ]+)([0-9]+)$/',
> '$1;$3;$5;$7;$9', $content);
>
> echo $content_csv;
> ?>

hallo nobody,
danke fuer die gute idee! hab das mal getestet und bisschen
rumprobiert; hab da aber leider noch probleme:

- es duerfen die zeilenumbruche nicht verloren gehen (da die daten
anschliessend zeilenweise in array geschriebene werden), d.h. ich
muesste zeilenweise ersetzungen durchfuehren (mit fgets()?)
- es kann in der spalte 'protocol' auch mal vorkommen, dass 'PIMv2',
also eine zahl direkt an der buchstaben-zeichenkette haengt (gibt mit
dem obigen script schwierigkeiten)
- allgemein hab ich das oben geschriebene script nicht zum laufen
gebracht. blick da nicht ganz durch im 'suchen-string'. was bedeutet
z.b. am anfang '^' oder am ende '$/'. es waere nett, wenn du mir da
noch genauere erlaeuterungen geben koenntest. hab mal schon auf
php.net/preg_replace geguckt, aber da hab ich das auch nicht richtig
finden koennen. gibt es irgendeine uebersicht aller moeglichkeiten,
die man mit preg_replace hat???

waere sehr froh, wenn ich das problem irgendwie loesen koennte! danke
fuer eure bemuehungen!
viele gruesse,
christoph

Nobody

unread,
Aug 13, 2004, 8:02:28 PM8/13/04
to
Christoph Rehers schrieb:

Hiermit geht´s dann besser:

<?php
$content = implode('', file('filename.txt'));
$content_csv =
preg_replace('/^([0-9]{1,2}:[0-9]{1,2})([ ]+)([0-9]+)([

]+)([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})([ ]+)([a-zA-Z0-9

]+?)([ ]+)([0-9]+)$/', '$1;$3;$5;$7;$9', $content);

echo $content_csv;

$array_content_csv = explode("\n", $content_csv);
foreach($array_content_csv as $line)
{
echo "$line <br />\n";
}
?>

Die Zeilenumbrüche sind nicht verloren. Du kannst den String mit dem
Content nach dem Ersetzen mit explode() in ein Array aufsplitten.
Das auch Protokolle mit Ziffern erkannt werden ist mit '([a-zA-Z0-9 ]'
jetzt geändert worden.

Jetzt die regulären Ausdrücke zu erklären würde etwas länger brauchen.
Doch zu den beiden Zeichen die du wissen wolltest:
^ steht für den Zeilenanfang
$ steht für das Zeilenende

Ich würde dir ein Fachbuch zu regulären Ausdrücke empfehlen. Im Internet
ist auch sehr viel nützliches zu finden, weiß jetzt aber keinen Link
auswendig :-(. Falls du Linux verwendest ein kleiner Tipp: Die regulären
Ausdrücke der Bash sind nicht viel anders.

Christoph Rehers

unread,
Aug 18, 2004, 4:42:17 AM8/18/04
to
> Hiermit geht´s dann besser:
>
> <?php
> $content = implode('', file('filename.txt'));
> $content_csv =
> preg_replace('/^([0-9]{1,2}:[0-9]{1,2})([ ]+)([0-9]+)([
> ]+)([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})([ ]+)([a-zA-Z0-9
> ]+?)([ ]+)([0-9]+)$/', '$1;$3;$5;$7;$9', $content);
>
> echo $content_csv;
>
> $array_content_csv = explode("\n", $content_csv);
> foreach($array_content_csv as $line)
> {
> echo "$line <br />\n";
> }
> ?>
>
> Die Zeilenumbrüche sind nicht verloren. Du kannst den String mit dem
> Content nach dem Ersetzen mit explode() in ein Array aufsplitten.
> Das auch Protokolle mit Ziffern erkannt werden ist mit '([a-zA-Z0-9 ]'
> jetzt geändert worden.
>
> Jetzt die regulären Ausdrücke zu erklären würde etwas länger brauchen.
> Doch zu den beiden Zeichen die du wissen wolltest:
> ^ steht für den Zeilenanfang
> $ steht für das Zeilenende
>
> Ich würde dir ein Fachbuch zu regulären Ausdrücke empfehlen. Im Internet
> ist auch sehr viel nützliches zu finden, weiß jetzt aber keinen Link
> auswendig :-(. Falls du Linux verwendest ein kleiner Tipp: Die regulären
> Ausdrücke der Bash sind nicht viel anders.

hi!
hab das inzwischen jetzt hinbekommen und es funktioniert einwandfrei!
das mit explode() habe ich nicht verwendet. stattdessen hab ich
einfach das '$' fuer zeilenende weggelassen und den rest ziemlich
belassen. da funzt das auch alles! :)
hab auch in meinem php referenz buch die regulaeren ausdruecke
gefunden! ;)
danke nochmals fuer deine hilfe und v.a. die idee!
viele gruesse,
christoph

0 new messages