2012-01-23 4 views
0

Iは、MySQLにCSVファイルをインポートするには、次の関数を使用しています:問題はどのように行の特定の値のcsvファイルをチェックし、ヘッダー行として使用し、重複がある場合は削除しますか?

は、その時々ヘッダ起因例えば放射源SOで切断したCSVファイルのマージに最初の行にない

function csv_2_mysql($source_file, $target_table, $max_line_length=10000) { 
    if (($handle = fopen("$source_file", "r")) !== FALSE) { 
     $columns = fgetcsv($handle, $max_line_length, ","); 
     foreach ($columns as &$column) { 
      $column = preg_replace('/[^a-z0-9]/i', '', $column); 
     } 
     $insert_query_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES"; 
     while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) { 
     while (count($data)<count($columns)) 
       array_push($data, NULL); 
      $query = "$insert_query_prefix (".join(",",quote_all_array($data)).");"; 
      mysql_query($query); 
     } 
     fclose($handle); 
    } 
} 

function quote_all_array($values) { 
    foreach ($values as $key=>$value) 
     if (is_array($value)) 
      $values[$key] = quote_all_array($value); 
     else 
      $values[$key] = quote_all($value); 
     return $values; 
} 

function quote_all($value) { 
    if (is_null($value)) 
     return "NULL"; 
    $value = "'" . mysql_real_escape_string($value) . "'"; 
    return $value; 
} 

次のようになります。

value1,value2,value3,value4 
value1,value2,value3,value4 
value1,value2,value3,value4 
header1,header2,header3,header4 
value1,value2,value3,value4 
value1,value2,value3,value4 
value1,value2,value3,value4 
value1,value2,value3,value4 
header1,header2,header3,header4 
value1,value2,value3,value4 
value1,value2,value3,value4 
value1,value2,value3,value4 

value1はユニークなので、ヘッダーを除いて重複する行はないことがわかります。重複するヘッダー行が存在する場合は削除され、残りのヘッダー行が$列に使用されるように関数を調整するにはどうすればよいですか?私は、各csvが異なる数の列を持つことを除いて、手動で列の値を設定します(header1とvalue1は常に一意のタイムスタンプとして存在します)。

UPDATE:

まあ、私はそれを考え出したが、それは関数fopenとのfile_get_contentsの両方を使用して間違って感じています。私は大きなCSVでこれに問題がありますか?

function csv_2_mysql($source_file, $target_table, $uid, $nid, $max_line_length=10000) { 
    if (($handle = fopen("$source_file", "r")) !== FALSE) { 
     $handle2 = file_get_contents($source_file) or exit; 
     $handle_row = explode("\n", $handle2); 
     foreach ($handle_row as $key => $val) { 
      $row_array = explode(',', $val); 
      foreach ($row_array as $key => $val) { 
       $row_array[$key] = trim(str_replace('"', '', $val)); 
       } 
       if(!in_array('header1', $row_array)) { 
       unset ($row_array); 
       } 
       else { 
       $columns = $row_array; 
       } 
      } 
     foreach ($columns as &$column) { 
      $column = preg_replace('/[^a-z0-9]/i', '', $column); 
     } 

     $insert_query_prefix = "INSERT INTO $target_table (".join(",",$columns).")\nVALUES"; 
     while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) { 
     while (count($data)<count($columns)) 
       array_push($data, NULL); 
      $query = "$insert_query_prefix (".join(",",quote_all_array($data)).");"; 
      mysql_query($query);   
     } 
     fclose($handle); 
    } 
} 

function quote_all_array($values) { 
    foreach ($values as $key=>$value) 
     if (is_array($value)) 
      $values[$key] = quote_all_array($value); 
     else 
      $values[$key] = quote_all($value); 
     return $values; 
} 

function quote_all($value) { 
    if (is_null($value)) 
     return "NULL"; 
    $value = "'" . mysql_real_escape_string($value) . "'"; 
    return $value; 
} 

答えて

-1

は、私はあなたが(あなたはそれがユニークであると言うので)最初のカラムの値をプッシュし、重複していないか確認するために、配列を持つことができると思います。重複している場合は、行を無視して続行します。

関連する問題