CSV Dateien via PHP Vergleichen und auswerten..

madirfan

Erfahrenes Mitglied
Hallo,

ich hab da eine frage..
Mit Hilfe vom ShellScripts erstelle ich von einer MYSQL Query ein CSV Datei. "siehe anhang"

Da diese jede woche erstellt wird, wollte ich diese via PHP vergleichen, was sie da geändert hat.

Beispiel:
Vergleiche 2013_JanuarWoche1.csv mit 2013_JanuarWoche2.csv

habt ihr da ein Beispiel, wie ich das machen kann?
 

Anhänge

Na die Frage ist erstmal wie sich die Dateien unterscheiden können.

Sind es unterschiedlich viele Zeilen oder unterscheiden sich diese immer nur bei den Zahlenwerten?
 
Sorry..das haette ich sagen müssen.. Der Unterschied ist immer der Zahlenwert..
Die Zeilen ändern sich nicht! Sind bei jeden CSV Datei immer gleich..

Das waren meine ideen:
Da diese CSV Dateinen automatisch generiert werden, wollte ich das immer die letzten 2 Dateien ausgewertet werden..

Beispie
2013_JanuarWoche1.csv,
2013_JanuarWoche2.csv
2013_JanuarWoche3.csv
2013_JanuarWoche4.csv
2013_FEBRUARWoche1.csv

Vergleich also 2013_JanuarWoche4.csv mit 2013_FEBRUARWoche1.csv ...

Hab eine Lösung gefunden

vergleiche/index.php?f1=vergleich1.csv&f2=vergleich.csv

Code:
<?php

//---- init
$strFileName1=isset($_REQUEST['f1'])?$_REQUEST['f1']:'';
$strFileName2=isset($_REQUEST['f2'])?$_REQUEST['f2']:'';

if ( !$strFileName1 ) { die("I need the first file (f1)"); }
if ( !$strFileName2 ) { die("I need the second file (f2)"); }

try {
    $arrFile1 = parseData($strFileName1);
    $arrFile2 = parseData($strFileName2);
} catch (Exception $e) {
    die($e->getMessage());
}

$rowCount1=count($arrFile1);
$rowCount2=count($arrFile2);

$colCount1=count($arrFile1[0]);
$colCount2=count($arrFile2[0]);

$highestRowCount = $rowCount1>$rowCount2 ? $rowCount1:$rowCount2;
$highestColCount = $colCount1>$colCount2 ? $colCount1:$colCount2;

$row = 0;
$err = 0;

//---- code

echo "<h2>comparing $strFileName1 and $strFileName2</h2>";
echo "\n<table border=1>";
echo "\n<tr><th>Err<th>Row#<th>Col#<th>Data in $strFileName1<th>Data in $strFileName2";
while($row<$highestRowCount) {
    if(!isset($arrFile1[$row])) {
        echo "\n<tr><td>Row missing in $strFileName1<th>$row";
        $err++;
    } elseif(!isset($arrFile1[$row])) {
        echo "\n<tr><td>Row missing in $strFileName2<th>$row";
        $err++;
    } else {
        $col=0;
        while($col<$highestColCount) {
            if ( !isset($arrFile1[$row][$col]) ) {
                echo "\n<tr><td>Data missing in $strFileName1<td>$row<td>$col<td><td>".htmlentities($arrFile2[$row][$col]);
                $err++;
            } elseif ( !isset($arrFile2[$row][$col]) ) {
                echo "\n<tr><td>Data missing in $strFileName1<td>$row<td>$col<td>".htmlentities($arrFile1[$row][$col]) ."<td>";
                $err++;
            } elseif ( $arrFile1[$row][$col] != $arrFile2[$row][$col] ) {
                echo "\n<tr><td>Data mismatch";
                echo "<td>$row <td>$col";
                echo "<td>".htmlentities($arrFile1[$row][$col]);
                echo "<td>".htmlentities($arrFile2[$row][$col]);
                $err++;
            }
            $col++;
        }
    }
    $row++;
}
echo "</table>";

if ( !$err ) {
    echo "<br/>\n<br/>\nThe two csv data files seem identical<br/>\n";
} else {
    echo "<br/>\n<br/>\nThere are $err differences";
}


//---- functions

function parseData($strFilename) {
    $arrParsed = array();
    $handle = fopen($strFilename , "r");
    if ($handle) {
        while (!feof($handle)) {
            $data = fgetcsv($handle , 0 , ',' , '"' );
            if ( empty($data)) continue; //empty row
            $arrParsed[]=$data;
        }
        fclose($handle);
    } else {
        throw new Exception("File read error at $strFilename");
    }
    return $arrParsed;
}

?>

Hab nur eine frage hierzu.. ich möchte gern anders darstellen:

CSV Datei:
Code:
ISO_COUNTRY_CODE,CNT_POSTAL_CODE,ORDER1_ADMIN_TYP_1112,ORDER2_ADMIN_TYP_1113,ORDER8_ADMIN_TYP_1119,BUILTUP_ID
AND,7,0,0,7,40
ARG,1970,25,0,514,4076
AUS,2612,9,0,10978,4597
AUT,2213,9,95,2354,10304
BEL,1148,3,11,589,3781
BGR,4507,28,0,264,5375

IST ZUSTAND des vergleichs:
Err Row# Col# Data in vergleich1.ccsv Data in vergleich2.csv
Data mismatch 3 4 10978 978


SOLL:
ISO_COUNTRY_CODE TABELLE Data in vergleich1.csc Data in vergleich2.csv
AUS CNT_POSTAL_CODE 1970 1980

Statt ROW und COL möchte die Namen des Feldes sehen..

Kann keiner helfen****
 
Vielleicht kannst du das ja für dein Vorhaben verwenden.

PHP:
<?php
$file1 = fopen("datei1.csv", "r");

while ($data = fgetcsv($file1, 1000, ";")) {
	$array1[] = $data;
}

fclose($file1);

$file2 = fopen("datei2.csv", "r");

while ($data = fgetcsv($file2, 1000, ";")) {
	$array2[] = $data;
}

fclose($file2);

echo "<p></p><p></p>Inhalt von Array 1<br />";
var_dump($array1);

echo "<p></p><p></p>Inhalt von Array 2<br />";
var_dump($array2);
echo "<p></p><p></p>Unterschied zwischen Array 1 und Array 2<br />";

for ($a = 0; $a < count($array1); $a++) {
    $diff = array_diff_assoc($array1[$a], $array2[$a]);
	var_dump($diff);
	echo "<p>------------</p>";
}
?>

Wobei du natürlich die Dateinamen noch anpassen musst.
 
vielen dank.. habs hinbekommen!!

PHP:
            } elseif ( $arrFile1[$row][$col] != $arrFile2[$row][$col] ) {
                echo "\n<tr><td>Data mismatch";
                echo "<td>".htmlentities($arrFile1[$row][0]);
                echo "<td>".htmlentities($arrFile1[0][$col]);
                echo "<td>$row <td>$col";
                echo "<td>".htmlentities($arrFile1[$row][$col]);
                echo "<td>".htmlentities($arrFile2[$row][$col]);
                $err++;
 
Zuletzt bearbeitet:
Zurück