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.