2 Dateien einlesen und Inhalt mergen

Dolphon

Erfahrenes Mitglied
HI,

ich habe folgendes Problem.
Ich habe 2 Dateien. Beide besitzen die gleiche Zeilenanzahl.
Nun soll ein bestimmter Teil aus einer Zeile der beiden Dateien in eine drite geschrieben werden.
Aber irgendwie komme ich da nicht weiter. Das 2. foreach ist Problem.
Hier einmal der Code.

PHP:
$fieldfile = file($argv[2]) or die ("cannot open file with field definitions ".$argv[2]."\n"); #FieldFile in ein Array einlesen
	$ticketfile = file($argv[1])  or die ("cannot open file with tickets ".$argv[1]."\n"); #TicketFile in ein Array einlesen
	$resultfile=fopen($argv[1].".txt","w");
	
	foreach ($fieldfile as $element)
	{
		list($field, $type, $name) = explode(";", $element);
		
		 foreach ($ticketfile as $element2) 
		{
			list($field2, $content) = explode("}:", $element2);
		
			 fputs($resultfile,$name.": ".$content."\r\n");
		}
	}
	
	fclose($resultfile);
 
Zuletzt bearbeitet:
Hallo,

dazu müsste man zunächst wissen, wie die Textdateien aufgebaut sind. Oder was für eine Fehlermeldung ausgegeben wird. Bricht das Script ab, oder wie äussert sich der Fehler?

Gruß
Markus
 
Das Skript läuft ohne Fehlermeldung durch.
Das Problem ist, dass Zeil 1 der ersten DAtei auch Zeile 1 der zweiten Datei ist.
Sprich, er holt sich aus der ersten Zeil der ersten Datei den Namen, und aus der ersten Zeil der zweiten Datei den Inhalt. Diese schreibt er dann in eine Zeile der dritten Datei. usw.

Allerdings klappt das mit dem Inhalt natürlich nicht.

Hier einmal der Aufbau der beiden DAteien:
DAtei 1
Code:
{Field 1};TIME;abgeschlossen am
{Field 2};CHAR;Absatz_Satz
{Field 3};TIME;Absend Dat
{Field 4};CHAR;Aktueller Stand
{Field 5};CHAR;Änderungsstand
{Field 6};INTEGER;AntwÜberschritten
{Field 7};CHAR;Band
{Field 8};CHAR;Baugruppe
{Field 9};CHAR;Bedienung
.......

Datei 2:

Code:
{Field 1}: 
{Field 2}: 
{Field 3}: 1210055969
{Field 4}: 
{Field 5}: 
{Field 6}: 1240
{Field 7}: 
{Field 8}: 
........
 
Sry, das war der alte Code, geändert.
Das Problem ist die 2. foreach Schleife, weil beide Schleifen immer nur 1 weiter springen sollen, aber die zweite immer komplett durchläuft, und dann die erste Foreach erst erhöht wird.

Somit habe ich in der Ausgabe z.B

Code:
abgeschlossen am: 
abgeschlossen am: 
abgeschlossen am: 1210055969
abgeschlossen am: 
abgeschlossen am: 
abgeschlossen am: 1240
abgeschlossen am: 
abgeschlossen am: 
abgeschlossen am: SynCraft
.......

Aussehen soll es aber so:
Code:
abgeschlossen am: 
Absatz_Satz:
Absend Dat:  1210055969
Aktueller Stand:
Änderungsstand:
AntwÜberschritten: 1240
.......
 
Zuletzt bearbeitet:
Hi,

OK, jetzt ist es besser verständlich. Das kannst Du so lösen:

PHP:
foreach ($fieldfile as $lineIndex => $element) {
        list($field, $type, $name) = explode(";", $element);
        list($field2, $content) = explode("}:", $ticketfile[$lineIndex]);
        ...
}

LG
 
Dann würde ich das so in der Art machen:
PHP:
$fieldfile = file($argv[2]) or die ("cannot open file with field definitions ".$argv[2]."\n"); #FieldFile in ein Array einlesen
$ticketfile = file($argv[1])  or die ("cannot open file with tickets ".$argv[1]."\n"); #TicketFile in ein Array einlesen
$resultfile=fopen($argv[1].".txt","w");

if( count($fieldfile)==count($ticketfile) )
{
    for($i=0; $i<count($fieldfile); $i++  )
    {
        list($field, $type, $name) = explode(";", $fieldfile[$i]);
        list($field2, $content) = explode("}:", $ticketfile[$i]);
        fputs($resultfile,$name.": ".$content."\r\n");
    }
}
fclose($resultfile);
 
Besten Dank für die Antworten.
Bevor ich einen neuen Thread aufmache, hier noch 3 weitere Fragen:

1. Die If-Abfrage
PHP:
	if (count(fieldfile) == count(ticketfile))

wird überhaupt nicht beachtet. Ich gebe ja zuvor die länge tesweise aus. Wenn ich die Werte 166 und 167 habe, dann läuft das Skript trotzdem ganznormal durch. Ohne die Fehlermeldung aus zugeben.

2. Wenn das Skript in einer Schleife aufgerufen wird und so ca. 80000 mal. (so viele Dateien gibts es.) wie sieht es da mit dem Speicher des Servers aus? Weil für jede Datei wird ja ein Array eröffnet. Wird der Speicherplatz automatisch wieder freigegeben, oder laufe ich gefahr das er alles zuhaut?

3. Ich bekome noch die PHP Notice

PHP:
	PHP Notice:  A non well formed numeric value encountered

wie bekomme ich dies noch weg? Richtig umgeformt wird es.





PHP:
if ($argc!=3) 
{
  echo "usage:\n     &lt;migfile&gt; is stem of ticket input data\n     &lt;fieldfile&gt; is name of file with field-structure data (fully qualified if needed)\n\n";
  exit;
} else 
{
	$fieldfile = file($argv[2]) or die ("cannot open file with field definitions ".$argv[2]."\n"); #FieldFile in ein Array einlesen
	$ticketfile = file($argv[1])  or die ("cannot open file with tickets ".$argv[1]."\n"); #TicketFile in ein Array einlesen
	$resultfile=fopen($argv[1].".txt","w");
	$i=0;
	echo count($fieldfile);
	echo "\r\n";
	echo count($ticketfile);
	if (count(fieldfile) == count(ticketfile))
	{
		foreach ($fieldfile as $lineIndex => $element) 
		{
			list($field, $type, $name) = explode(";", $element);
			$name = str_replace(array("\r", "\n"), '', $name); //entfernt Zeilenumbruch
			list($field2, $content) = explode("}:", $ticketfile[$lineIndex]);
			trim($content); #überflüssige Zeichen am Anfang und Ende entfernen \n \r \t \v \leerzeichen

			if ($content==0) 
			{ 
				#echo "empty data in line ".$i." for ".$name.", skipped\n";
				$i++;
				continue;
			}
			
			if ($type=="TIME") 
			{
				fputs($resultfile,$name.": ".strftime("%d.%m.%Y %H:%M:%S",$content)."\r\n");
			} 
			else 
			{
				#echo "==using field value for: ".$name.": ".$content."\n";
				fputs($resultfile,$name.":".$content."");
			}
			$i++;
		}  
		fclose($resultfile);
		echo "output file written: ".$argv[1].".txt";
	} else
	{
		echo "File: ".$argv[1]." and File:".$argv[2]." are not conform";
	}
}
 
hmm, meine Lösung war mal eben aus dem Ärmel geschüttelt, ohne das zu testen.
Zu 1:
Mit dem count sollte eigentlich nicht sein. Kann mir vorstellen, dass du den Vergleich Typ-gerecht machen musst, also statt
PHP:
count($a)==count($b)
PHP:
count($a)===count($b)

Zu 2:
Kann ich jetzt nicht genau sagen, aber ich meine, dass der Speicher wieder freigegeben wird, wenn die Arrays oder die Dateizeiger nicht mehr gebraucht werden.
Ich vermute aber, dass bei 8000 Dateien (je nachdem auch, wieviel drin steht) die Standard-Ausführungszeit des Scripts erreicht wird, und es deshalb abbricht.

Zu 3: Steht zur Notice eine Zeile?

Gruß
Markus
 
Zurück