好的,所以我有一个按钮。按下时它会这样做:
Javascript
$("#csv_dedupe").live("click", function(e) {
file_name = 'C:\\server\\xampp\\htdocs\\Gene\\IMEXporter\\include\\files\\' + $("#IMEXp_import_var-uploadFile-file").val();
$.post($_CFG_PROCESSORFILE, {"task": "csv_dupe", "file_name": file_name}, function(data) {
alert(data);
}, "json")
});
这个 ajax 调用被发送到这个:
PHP
class ColumnCompare {
function __construct($column) {
$this->column = $column;
}
function compare($a, $b) {
if ($a[$this->column] == $b[$this->column]) {
return 0;
}
return ($a[$this->column] < $b[$this->column]) ? -1 : 1;
}
}
if ($task == "csv_dupe") {
$file_name = $_REQUEST["file_name"];
// Hard-coded input
$array_var = array();
$sort_by_col = 9999;
//Open csv file and dump contents
if(($handler = fopen($file_name, "r")) !== FALSE) {
while(($csv_handler = fgetcsv($handler, 0, ",")) !== FALSE) {
$array_var[] = $csv_handler;
}
}
fclose($handler);
//copy original csv data array to be compared later
$array_var2 = $array_var;
//Find email column
$new = array();
$new = $array_var[0];
$findme = 'email';
$counter = 0;
foreach($new as $key) {
$pos = strpos($key, $findme);
if($pos === false) {
$counter++;
}
else {
$sort_by_col = $counter;
}
}
if($sort_by_col === 999) {
echo 'COULD NOT FIND EMAIL COLUMN';
return;
}
//Temporarily remove headers from array
$headers = array_shift($array_var);
// Create object for sorting by a particular column
$obj = new ColumnCompare($sort_by_col);
usort($array_var, array($obj, 'compare'));
// Remove Duplicates from a coulmn
array_unshift($array_var, $headers);
$newArr = array();
foreach ($array_var as $val) {
$newArr[$val[$sort_by_col]] = $val;
}
$array_var = array_values($newArr);
//Write CSV to standard output
$sout = fopen($file_name, 'w');
foreach ($array_var as $fields) {
fputcsv($sout, $fields);
}
fclose($sout);
//How many dupes were there?
$number = count($array_var2) - count($array_var);
echo json_encode($number);
}
这个 php 从 csv 文件中获取所有数据。列和行,并使用 fgetcsv 函数将所有数据分配给一个数组。现在我在那里有代码,它还通过单个列对 csv 文件进行重复数据删除(查找并删除副本的副本)。保持整个数组的行列结构不变。
唯一的问题是,即使它适用于我测试过的有 10 行左右的小文件,它也不适用于 25,000 行的文件。
现在在你说它之前,我已经进入了我的 php.ini 文件并将 max_input、文件大小、最大运行时间等更改为天文值,以确保 php 可以接受高达 999999999999999MB 的文件大小和运行几个脚本的时间一百年。
我使用了一个包含 25,000 条记录的文件并执行了脚本。两个小时过去了,fiddler 仍然显示尚未发回 http 请求。有人可以给我一些优化服务器和代码的方法吗?
我能够使用来自帮助我解决另一个问题的用户的代码,我最初发布了如何做到这一点。我现在担心的是,即使我对其进行了测试,但我想知道如何在不到一分钟的时间内使其工作。Excel 可以在几秒钟内对一列一百万条记录进行重复数据删除 为什么 php 不能这样做?