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