2011-10-23 46 views

回答

0

你有文件A和文件B

解析的文件A併爲每個行對象和一行的內容存儲在一個對象。在創建對象時,將它們存儲在一個數組中。

做同樣的事情的文件B.

所以,現在你有兩個數組,第一個數組存儲在文件中的行的所有數據,以及另一陣列B.

現在,您需要迭代通過你的第一個數組,首先在數組A中的每個對象,掃描數組B,並檢查B中是否有相同的對象,如果數組A中的所有元素都通過了這個。這意味着他們是理想的。否則,休息。

2

,我認爲這是實際的代碼的主維達說:

#!/usr/bin/php 
<? 
$strFile1 = $argv[1]; 
$strFile2 = $argv[2]; 

function parseData($strFilename) { 
    $strAllData = file($strFilename); 
    foreach($strAllData as $intLineNum => $strLineData) { 
    $arrLineData = explode(',',$strLineData); 
    } 
    return $arrLineData; 
} 

$arrFile1 = parseData($strFile1); 
$arrFile2 = parseData($strFile2); 

$intRow = 0; 
foreach($arrFile1 as $intKey => $strVal) { 
    if(!isset($arrFile2[$intKey]) || ($arrFile2[$intKey] != $strVal)) { 
    exit("Column $intKey, row $intRow of $strFile1 doesn't match\n"); 
    } 
    $intRow++; 
} 
print "All rows match fine.\n"; 

?> 
+0

我知道這是舊的,但'$ argv [1]'是什麼? – BandonRandon

+0

所以你做什麼Bandon將所有的代碼都保存到你的* nix盒子的一個文件(比如「compare-csvs.php」),使它可執行('chmod + x compare-csvs.php') 。然後調用「compare-csv.php」,比如:'compare-csvs.php /path/to/first-csv.csv/path/to/second-csv.csv'快樂黑客! – rICh

1

有一點問題,與rlCH代碼示例,即

  • 不能處理多行以csv
  • 只能在一個方向上在第一差分
0123處理分歧
  • 停止

    雖然它可能足夠的操作我正在尋找一種方法來正確比較兩個多行csv文件。 (多行包含跨越多行的數據)所以我花了時間創建一個,我想爲什麼不分享它。也許它爲某人節省了一些時間。

    現在,我沒有使用命令行PHP,所以如果你想要做的,我建議你改變輸入處理和輸出(這個輸出HTML,所以你可以在瀏覽器中使用它)

    用法; 把腳本和文件在目錄 調用腳本比較兩個參數,f1和f2 如compareCSV.php?F1 = file1.csv & F2 = file2.csv

    <?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; 
    } 
    
    ?>