• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

(?) *.txt ins *.csv konvertieren

noxx2

Neues Mitglied
hallo

kann mir jemand evtl unter die arme greifen

gibt es eine möglichkeit txt files in csv zu konvertieren per php ?

auf meinem webserver werden monatlich daten einer wetterstatiom
abgelegt, die würde ich gerne zur weitervearbeitung (mysql) als csv haben.

beispiel dateien:
/NOAA-2012-09.txt
oder
/NOAA-2012-10.txt

gruss
 
1.
Man kann den Text zeilenweise einlesen, in seine Bestandteile zerlegen (z.B. Trennzeichen Space) und dann neu zusammenbauen.
Problem, dass da mal 1 oder mehrere Spaces sind, also unterschiedliche Arraygrössen herauskommen -> Also prüfen, ob ein Eintrag leer ist und den dann verwerfen und nur Einträge verwenden, die Inhalte haben.
Das Ergebnis dann mit z.B. TAB als Trennzeichen neu zusammensetzen und als CSV speichern.

2.
Zeilenweise einlesen, den String nach fester Länge aufteilen, Leerzeichen vor und nach dem Eintrag entfernen und das dann z.B. als TAB getrennte CSV Datei speichern

3.
Im Text alle Leerzeichen durch ein TAB ersetzen, danach doppelte TAB-Einträge entfernen und durch einfache ersetzen und du hast eine fertige CSV-Datei.


Problem überall sind die Trennlinien und Leerzeilen.
Nicht ganz trivial das Ganze...
 
Zuletzt bearbeitet von einem Moderator:
danke

ich brauche ja nicht alle werte in der csv, nur das was zwischen den minusstrichen steht, also


Code:
---------------------------------------------------------------------------------------
14    10.4   10.4  18:38   10.4  18:38   14.3    0.0     0.0  1.9     4.8  18:39   WSW
15    10.3   12.2  14:17    8.2  07:17   14.6    0.0     3.6  1.9    16.1  11:16   W
16    10.2   11.7  16:27    8.8  07:45   14.5    0.0     0.7  1.3     8.0  11:22   W
---------------------------------------------------------------------------------------

Weiss nicht, ob das dann einfacher wird

Gruss
 
Ungetestet:
PHP:
<?php

   $fp = @fopen("datei.txt", "r")
      or die ("Datei konnte nicht geöffnet werden");
      
   $lines = array();
   
   $ignore = true;
   
   while ($line = fgets($fp, 1024))
   {
       $line = trim ($line);
       
       if (strpos ($line, "----") == 0)
       {
           if (! $ignore)
           {
               break;
           }
           else
           {
              $ignore = ! $ignore;
              continue;
           }
       }
       
       if (! $ignore)
          $lines[] = $line;
   }
   
   
   if (count($lines))
   {
      $csvData = array();
      
      foreach ($lines as $line)
      {
         $data = explode (" ", $line);
         
         array_walk($data, create_function('&$val', '$val = trim($val);'));
         
         $csvData[] = implode(";", $data);   
      }
      
      file_puts_contents("datei.csv", implode("\n", $csvData);
      
      echo "Ready";
   }
   else
      echo "Fehler! keine Zeilen gefunden;
?>
 
Zuletzt bearbeitet von einem Moderator:
Das ist eine Abfrage mehr, sonst nichts. Wenn die Daten immer in Zeile 7 (wo auch immer) beginnen, ist es noch einfacher.

Dein Problem scheint mir aber mehr zu sein, dass du keine Ahnung hast wie du das angehen sollst und auf ein fertiges Script wartest.
Nochmal, da du keinen eindeutigen Separator in deinem Textfile hast, ist das nicht mal eben aus dem Hut gezaubert. Da sind einige Prüfungen zu machen, weil man sonst Daten verlieren kann.

Vielleicht findet sich ja wer, der sich erbarmt, aber mal eben so aus dem Stegreif.....
 
So geht's:
PHP:
<?php
$zeilen = file ('eingabe.txt');
$fp = fopen('ausgabe.csv', 'w');
$i = 0;
while (strpos($zeilen[$i], "--------") === false && $i < count($zeilen)) $i++;
$i++;
while (strpos($zeilen[$i], "--------") === false && $i < count($zeilen))
{
  $zeilen[$i] = preg_replace ('/ +/', ';', $zeilen[$i]);
  echo $zeilen[$i];
  fputs($fp, $zeilen[$i]);
  $i++;
}
fclose($fp);
?>
Viel Erfolg und viele Grüße - Ulrich
 
Zuletzt bearbeitet von einem Moderator:
Dass es funktioniert, ist aber Glücksache. $i wird nicht initialisiert und daher ist es PHP zu verdanken, dass dein Index nicht ins Nirvana geht.
 
Danke. Hab natürlich recht das ich mit php (noch) nicht viel am Hut habe. daher weiss ich auch nicht obs schon sowas in der richtung gibt/gab.

alternativ liegen auch txt in diesem Format vor:
/Archive/ARC-2012-10-17.txt
/Archive/ARC-2012-10-18.txt
Für jeden Tag habe ich 1 File

Da würde aber eine reine Konvertierung txt -> csv nicht reichen, weils
zuviele Daten sind. Ich benötige pro Tag nur Minimum und Maximun Werte und bei einigen Werten wie zb Temperatur den Durchschnitt. Das müsste dann wohl das php-script irgendwie filtern.

Wenn jemand irgendwas fertiges hat, wäre ich natürlich dankbar. Links und Tipps würden ja evtl auch helfen.

Die *.csv soll später per Cronjob jeden Tag in eine mySQL DB auf dem Webserver eingelesen werden. txt können nach der Konvertierung gelöscht werden.

Danke sehr!
Gruss


Edit:

Habe mal versucht mit dem Notepad aus der ARC-*.txt ein csv zu basteln

Zeile 1 + 2 gelöscht
Ersetze TAB mit (\t) durch Komma (,)
Erstze LEERZEICHEN ( ) durch Komma (,)

dann sah es so aus:

Code:
20121018,00:00,13.1,13.1,13.1,92,11.8,1,3,244,0.0,999.5,-100000,-100000.000,0.0
20121018,00:05,13.1,13.1,13.1,92,11.8,2,3,252,0.0,999.4,-100000,-100000.000,0.0
20121018,00:10,13.1,13.1,13.1,92,11.8,2,2,252,0.0,999.4,-100000,-100000.000,0.0
20121018,00:15,13.1,13.1,13.1,92,11.9,2,3,264,0.0,999.4,-100000,-100000.000,0.0
20121018,00:20,13.1,13.1,13.1,93,12.0,2,2,270,0.0,999.5,-100000,-100000.000,0.0
20121018,00:25,13.1,13.1,13.1,93,12.0,2,2,262,0.0,999.6,-100000,-100000.000,0.0
20121018,00:30,13.1,13.1,13.1,93,12.0,2,3,253,0.0,999.6,-100000,-100000.000,0.0
20121018,00:35,13.2,13.2,13.2,93,12.1,2,3,264,0.0,999.6,-100000,-100000.000,0.0
20121018,00:40,13.2,13.2,13.2,93,12.1,1,2,261,0.0,999.5,-100000,-100000.000,0.0
20121018,00:45,13.2,13.2,13.2,93,12.1,0,2,257,0.0,999.4,-100000,-100000.000,0.0
20121018,00:50,13.2,13.2,13.2,93,12.1,0,2,270,0.0,999.4,-100000,-100000.000,0.0
20121018,00:55,13.3,13.3,13.3,93,12.2,0,2,270,0.0,999.4,-100000,-100000.000,0.0
20121018,01:00,13.2,13.2,13.2,93,12.1,0,0,-100000,0.0,999.4,-100000,-100000.000,0.0
20121018,01:05,13.2,13.2,13.2,93,12.1,0,2,252,0.0,999.5,-100000,-100000.000,0.0
20121018,01:10,13.2,13.2,13.2,93,12.1,1,2,252,0.0,999.5,-100000,-100000.000,0.0
....
 
Zuletzt bearbeitet:
Ich benötige pro Tag nur Minimum und Maximun Werte und bei einigen Werten wie zb Temperatur den Durchschnitt. Das müsste dann wohl das php-script irgendwie filtern.
Sind das dann wirklich alle Anforderungen oder kommst du, nachdem dir jemand eine Lösung gepostet hat, mit den nächsten Wünschen?
 
Nein, sorry. Aber diese Werte mit Min Max waren ja in den ersten TXT Files schon drin. Die TXT die ich 3 Post weiter oben habe, liegen zwar auch auf dem Webserver, aber diese Daten nicht nicht zusammengefasst. Habs nun selbst mal versucht, mit etwas lesen, aus diesen Files eine CSV zu machen:

PHP:
<?php
set_time_limit(0);

$datum = date("Y-m-d");

$inhalt = file("ARC_".$datum.".txt");

unset($inhalt[0]);
unset($inhalt[1]);

$match1 = "/\t/";
$match2 = "/ /";

$inhalt2 = preg_replace($match1,',',$inhalt);
$inhalt3 = preg_replace($match2,',',$inhalt2);

$fp = fopen("ARC_".$datum.".csv", 'w');
fputs($fp, implode("", $inhalt3));
fclose($fp);

Scheint zu gehen. Jetzt würde mir noch das zusammenfassen der Daten fehlen und das er auch
die TXT Dateien erkennt. Kommt ja jeden Tag eine neue hinzu. Oder, keine Ahnung obs geht,
das Script guckt im Ordner ARCHIVE nach ARC*.txt Files, konvertiert diese und löscht sie dann.



EDIT:

Habe mal etwas weitergelesen, verstehe es aber nicht 100%. Das Konvertieren klappt nun eigentlich,
jedoch bekomme ich es nicht hin die Spalten und Werte in der csv zu konvertieren. Einige Spalten können weg,
andere sollen neu hinzukommen, mit Werten die aus der "ersten" csv abgeleitet werden.

In etwa so:
Lösche Spalte
1,2,8,13,14,15

Min / Max / Durchschnittswerte Spalte
3,4,5,6,7,12

Max Werte aus Spalte
9

Durchschnittswerte aus Spalte
10

Summe der Werte aus Spalte
11

Am Ende brauche ich eine csv die in etwas so aufgebaut ist, also nur eine Zeile noch hat.
Code:
Datum | S3_Min | S3_Max | S3_DS | S4_Min | S5_Max | S6_DS | S7_Min | S7_Max | S7_DS | S12_Min | S12_Max | S12_DS | S9_MAX | S10_DS | S11_SUMME |

fgetcsv scheint wohl das Stichwort zu sein, aber komme da nicht voran.

Gruss
 
Zuletzt bearbeitet:
Zurück
Oben