2011-10-23 13 views
0

2人のcsvファイルの内容を比較し、同じ行を報告する最良の方法は何ですか。PHPの2 csvファイルの内容を比較する

同じ意味で、各列に同じ値を持つレコードです。

+0

あなたはできませんでした'diff'を使ってコマンドラインでそれらを比較するだけですか? –

答えて

0

あなたは、ファイルAとファイルB

解析ファイルAを有し、行ごとにオブジェクトを作成して、一つのオブジェクトに一列のコンテンツを格納します。オブジェクトを作成している間、配列にそれらを格納します。

今、あなたは二つの配列、ファイルAの行のすべてのデータを格納するための最初のアレイ、およびB.

のための別の配列を持っている今、あなたがする必要があるファイルBだから、

についても同じことを行いますあなたの最初の配列、最初に配列Aの各オブジェクトを繰り返し、配列Bをスキャンし、配列Aのすべての要素がこれを渡す場合、Bに同じオブジェクトがあるかどうかを確認します。それは彼らが同一であることを意味します。それ以外の場合は中断します。

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/sec second-csv.csv'ハッピーハッキング! – rICh

1

RLCHによってコード例の問題のビット、すなわち

  • は、複数行を扱うことができない、ありますCSV
  • は一方向のみの違い
  • 第1の差分
0123で停止を処理することができます

オペアンプでは十分かもしれませんが、2つのマルチライン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; 
} 

?> 
関連する問題