Zitat:
Zitat von Ckaos
was machst du da?
|
Ich versuche eine einfaches Konvertierungsprogramm zu schreiben:
1. Datei in Array einlesen.
//Die Datei hat den Aufbau:
DelimiterDatensatznummer
FeldnameFeldinhalt
FeldnameFeldinhalt
DelimiterDatensatznummer
FeldnameFeldinhalt
FeldnameFeldinhalt
usw.
2. Das Array mehrdimensional machen mit [n][0] ist Feldname und [n][1] ist Feldinhalt
3. Eine weitere Datei mit einer Feldkonkordanz in eine Array lesen
//Aufbau:
alter_Feldbezeichung irgendeinDelimiter neue_Feldbezeichnung
4. Dann mit verschachtelten Loops die alten Feldnamen aus Array1 mit den alten Feldnamen aus Array2 (die Konkordanz) abgleichen und im Trefferfall mit neuer Feldbezeichnung aus Array2 ersetzen
5. Das ganze wieder implodieren und in eine neue Datei schreiben.
Wenn ich nur einen Datensatz habe, geht das wunderbar. Das Problem trat in diesem Fall erst nach implode() auf und konnte mit
PHP-Code:
for ($i = 0; $i < count($mab); $i++){
$Array1[$i] = str_replace( array("\n" , "\r" ) , '' , $Array1[$i] );
}
gelöst werden.
Nun tritt das Problem von vorneherein auf.
Als ich nur einen Datensatz hatte, also nur einmal
//DelimiterDatensatznummer
//FeldnameFeldinhalt
//FeldnameFeldinhalt
war meinArray1 durchgehend zweidimensional. Mit mehreren Datensätzen musste ich es dreidimensional machen, und jetzt hilft weder
array_walk($meinArray, 'myfunc') mit trim noch rtrim noch str_replace zwecks Entfernens von \n und \r noch sonst irgendwas.
Zitat:
Zitat von meikel
Vermutlich isses wieder mal das Grundübel:
eine unter Windows erstellte Textdatei wird mit file() in ein Array geladen. Das Dumme daran ist, daß file() vom Windows Zeilenumbruch "\r\n" nur das "\n" entfernt. Somit klebt am Ende der Arrayelemente ein "\r".
|
Yep. Windows. Texteditor.
Minimalbeispiel ist ein bisschen schwierig, da das ganze sehr lang ist (Anfänger ...).
Aber man soll ja auch zur allgemeinen Unterhaltung beitragen... :) Here goes:
Zitat:
Array
(
[###
] => ###
[001
] => neuer_Feldname
[002a
] => neuer_Feldname
[003
] => neuer_Feldname
usw.
|
Hier sieht man das Problem am besten. Irgendwie entsteht innerhalb des Keys ein Zeilenumbruch (oder was auch immer). Meine Versuch mit trim usw. scheinen nicht zu funzen. Das ganze ist das Ergebnis von folgendem Code. (Dies ist nicht exakt die oben beschriebene Vorgehensweise, das war eine neuer Versuch, hier sieht man es nur besser.)
PHP-Code:
<pre>
<?php
include("parameter.htm");
$mab = file("mab_mehrere_DS.html");
//zählt die Anzahl der Datensätze in $mab
$regex = '/^###/';
$count = 0;
$anfangszeilen = array();
for ($i = 0; $i < count($mab); $i++){
if (preg_match($regex, $mab[$i], $matches) == 1){
$count++;
//legt alle gefundenen Zeilen in einem Array ab
$anfangszeilen[$count-1]= $i;
}
}
//echo $count . "<br />"; //Anzahl der gefundenen Datensätze
//print_r($anfangszeilen);
//teilt $mab in Subarrays mit je einem Datensatz auf
for ($i = 0; $i < $count; $i++){
if($i == 0){
$datensatzlaenge = $anfangszeilen[$i+1];
}
else {
$datensatzlaenge = $anfangszeilen[$i]- $anfangszeilen[$i-1];
}
for ($j = 0; $j < $datensatzlaenge; $j++){
$newarray[$i][$j] = $mab[$j];
}
}
$mab = $newarray;
//print_r($mab);
$mab_kopie = $mab;
//ersetzt jeweils ab dem 5. Zeichen mit leerem String
function CutAb5BisEnde(&$item)
{
$suchmuster = '/^(.{4})(.+$)/';
$ersetzung = '$1';
$item = preg_replace($suchmuster, $ersetzung, $item);
}
array_walk($mab, 'CutAb5BisEnde');
//print_r($mab);
//ersetzt die erstem vier Zeichen mit leerem String
function CutEinsBisVier(&$item2) {
$suchmuster2 = '/(?:^.{4})(.+)$/';
$ersetzung2 = '$1';
$item2 = preg_replace($suchmuster2, $ersetzung2, $item2);
}
array_walk($mab_kopie, 'CutEinsBisVier');
//print_r($mab_kopie);
//erzeugt das dreidimensionale Array
for ($i = 0; $i < count($mab); $i++){
if($i == 0){
$datensatzlaenge = $anfangszeilen[$i+1];
}
else {
$datensatzlaenge = $anfangszeilen[$i]- $anfangszeilen[$i-1];
}
for ($j = 0; $j < $datensatzlaenge; $j++){
$mab[$i][$j] = array($mab[$i][$j], $mab_kopie[$i][$j]);
}
}
//print_r($mab); //$mab ist jetzt das dreidimensionale Ergebnisarray zur Weiterarbeit
//Konkordanz einlesen
$konkordanz = file("Konkordanz.inc.php");
$konkordanz_kopie = $konkordanz;
//print_r($konkordanz);
//ersetzt jeweils ab dem 5. Zeichen mit leerem String
array_walk($konkordanz, 'CutAb5BisEnde');
//print_r($konkordanz);
//ersetzt die erstem vier Zeichen mit leerem String
array_walk($konkordanz_kopie, 'CutEinsBisVier');
function CutColons(&$item3) {
$suchmuster3 = '/::[\s]{0,100}/';
$ersetzung3 = '';
$item3 = preg_replace($suchmuster3, $ersetzung3, $item3);
}
array_walk($konkordanz_kopie, 'CutColons');
//print_r($konkordanz_kopie);
//setzt die Elemente von $konkordanz als keys für die Werte von $konkordanz_kopie
$konkordanz = array_combine($konkordanz, $konkordanz_kopie);
print_r($konkordanz); //Das hier erzeugt die Ausgabe die oben steht
?>
</pre>
Und ja, ich weiß tl;dr...
Danke, falls jemand beim Überfliegen einen Tipp hat!
Vielen Dank euch beiden!