Raketenwilli: Skript für diesen Einzelfall

Beitrag lesen

Um mal zu zeigen, was man machen könnte:

Fehlerhafte „CSV“-Datei im Editor:

12345|zzzzz oooo ppppp||111

22633|yyyyy 10 Liter 
Ersetzt 198323||189,00

22634|"yyyyy 20 Liter 
Ersetzt 19abc4"||361,00

Offenbar sollen das 3 Datentupel („Zeilen“) zu je 4 Items („Spalten“) werden. Das der Zeilentrenner zwei Bedeutungen hat zerlegen wir am "|" und die vierte Spalte am (ersten) Zeilenumbruch, bauen daraus einen eindimensionalen Array mit allen Items, aus diesem dann den zweidimensionalen:

<?php

define( 'Delemiter', '|' );
define( 'RowDelemiter', "\n" );
define( 'Columns',   '4' );
define( 'FileName', './test.txt');

$text = trim( file_get_contents( FileName ) );
$data = explode( Delemiter, $text );

$helperArray=[];
$helperIndex=0;

foreach ( $data as $item ) {
	if ( 0 == ( $helperIndex +1)  % Columns ) {
		$a = explode( RowDelemiter, $item, 2 );
		foreach ( $a as $s ) {
			$helperArray[] = trim( $s, "\"\r\n");
			$helperIndex ++;
		}
	} else {
		$helperArray[] = trim( $item, "\"\r\n");
		$helperIndex ++;
	}
}	

$array = [];
$dataRow = 0;
$dataColumn = 0;


foreach ( $helperArray as $item ) {
     	
	if ( $dataColumn == Columns ) {
		$dataColumn = 0;
		$dataRow ++;
	}
	
	$array[$dataRow][$dataColumn]=$item;
    $dataColumn ++;
}

print_r( $array );

Das sieht jetzt nach dem aus, was Du wohl willst. Aber bei weiteren Fehlern in der Quelle versagt das natürlich „glänzend“:

Array
(
    [0] => Array
        (
            [0] => 12345
            [1] => zzzzz oooo ppppp
            [2] => 
            [3] => 111
        )

    [1] => Array
        (
            [0] => 22633
            [1] => yyyyy 10 Liter 
Ersetzt 198323
            [2] => 
            [3] => 189,00
        )

    [2] => Array
        (
            [0] => 22634
            [1] => yyyyy 20 Liter 
Ersetzt 19abc4
            [2] => 
            [3] => 361,00
        )

)

Weitere Fehler machen die Sache weitaus komplizierter: Es bleibt also bei meiner Aussage, dass ein sauberer Datenexport eine weitaus bessere Lösung ist!

Moderne Systeme können den übrigens als JSON. Das wieder lässt sich auch leichter einlesen.