我是否采取了正确的方法来处理这些文件?(使用PHP的CSV)

我是否采取了正确的方法来处理这些文件?(使用PHP的CSV),php,file,csv,processing-efficiency,Php,File,Csv,Processing Efficiency,我是一名暑期实习的学生。我的任务是处理从excel到SQL Server数据库的数据输入,这些数据是多年来进行的调查数据。任务概述如下: 有三个表格,一个主要事件,一个单独的事件和一个单独的事件。一个事件有许多单独的事件,一个单独的事件有许多单独的事件。我的代码只涉及最后两个表 我读了两个文件,一个文件中列出了所有个人事件,另一个文件中列出了所有个人。个体的数据告诉我它与什么个体事件相关 我的代码基本上读取一个单独的事件,然后在第二个文件中查找任何相关的个人。对于个人文件中的每一行,如果关联,则

我是一名暑期实习的学生。我的任务是处理从excel到SQL Server数据库的数据输入,这些数据是多年来进行的调查数据。任务概述如下:

有三个表格,一个主要事件,一个单独的事件和一个单独的事件。一个事件有许多单独的事件,一个单独的事件有许多单独的事件。我的代码只涉及最后两个表

我读了两个文件,一个文件中列出了所有个人事件,另一个文件中列出了所有个人。个体的数据告诉我它与什么个体事件相关

我的代码基本上读取一个单独的事件,然后在第二个文件中查找任何相关的个人。对于个人文件中的每一行,如果关联,则将其插入到适当的表中,否则将写入新文件。遍历整个文件后,新文件将复制到旧文件,从而删除已输入数据库的数据

这一复制过程使执行时间缩短了3分钟,只需一次又一次地重新读取完整的个人文件即可。但有更好的方法吗?我的样本数据的执行时间约为47秒……理想情况下,我希望这一时间更短

任何建议,无论多么微不足道,都将不胜感激

编辑: 这是我正在使用的代码的精简版本

<?php
//not shown:
//connect to database 
//input event data
//get the id of the event
//open files
$s_handle = fopen($_FILES['surveyfile']['tmp_name'],'r');//open survey file
copy($_FILES['cocklefile']['tmp_name'],'file1.csv');//make copy of the cockle file
//read files
$s_csv = fgetcsv($s_handle,'0',',');

//read lines and print lines
// then input data via sql

while (! feof($s_handle))
{
    $max_index = count($s_csv);
    $s_csv[$max_index]='';
    foreach($s_csv as $val)
    {
        if(!isset($val))
        $val = '';
    }
    $grid_no = $s_csv[0];
    $sub_loc = $s_csv[1];
    /*
    .define more variables
    .*/
    

    $sql = "INSERT INTO indipendant_event" 
        ."(parent_id,grid_number,sub_location,....)"
        ."VALUES ("
        ."'{$event_id}',"
        ."'{$grid_no}',"
        //...
        .");";

    if (!odbc_exec($con,$sql))
    {
        echo "WARNING: SQL INSERT INTO fssbur.cockle_quadrat FAILED. PHP.";
    }
    //get ID
    $sql = "SELECT MAX(ind_event_id)"
    ."FROM independant_event";
    $return =  odbc_exec($con,$sql);
    $ind_event_id = odbc_result($return, 1);
    
    //insert individuals
    $c_2 = fopen('file2.csv','w');//create file c_2 to write to 
    $c_1 = fopen('file1.csv','r');//open the data to read
    $c_csv = fgetcsv($c_1,'0',',');//get the first line of data
    while(! feof($c_1))
    {
        
        for($i=0;$i<9;$i++)//make sure theres a value in each column
        {
            if(!isset($c_csv[$i]))
            $c_csv[$i] = '';
        }
        //give values meaningful names
        $stat_no = $c_csv[0];
        $sample_method = $c_csv[1];
        //....
        
        //check whether the current line corresponds to the current station
        if (strcmp(strtolower($stat_no),strtolower($grid_no))==0)
        {
            $sql = "INSERT INTO fssbur2.cockle"
                ."(parent_id,sampling_method,shell_height,shell_width,age,weight,alive,discarded,damage)"
                ."VALUES("
                ."'{$ind_event_id}',"
                ."'{$sample_method}',"
                //...
                ."'{$damage}');";
            //write data if it corresponds
            if (!odbc_exec($con,$sql))
            {
                echo "WARNING: SQL INSERT INTO fssbur.cockle FAILED. PHP.";
            }     
            $c_csv = fgetcsv($c_1,'0',',');  
        }
        else//no correspondance
        {
            fputcsv($c_2,$c_csv);//write line to the new file
            $c_csv = fgetcsv($c_1,'0',',');//get new line
            continue;//rinse and repeat
        }
    }//end while, now gone through all individuals, and filled c_2 with the unused data
    fclose($c_1);//close files
    fclose($c_2);
    copy('file2.csv','file1.csv');//copy new file to old, removing used data
    $s_csv = fgetcsv($s_handle,'0',',');
}//end while

//close file
fclose($s_handle);
?>

您可以使用文件中的数据创建一个临时数据库,然后使用临时数据库/表将数据转换为新表单。这可能会更快,尤其是当您需要进行查找并且需要将条目标记为已处理时。

我可能还没有完全理解该过程,但为什么不将整个CSV插入数据库表中呢。这看起来像是白费力气,但很可能会有回报。完成初始导入后,查找与事件关联的任何个体都应该快得多,因为DBMS将能够使用索引来加速这些查找(与基于文件的线性遍历相比)。准确地说:您的“个人”表可能在“个人事件”表中有一个外键。只要您在这个外键上创建一个索引,查找速度就会大大加快(简单地将这个字段声明为外键可能会导致SQL server自动为它编制索引,但我不能肯定,我并没有真正使用MSSQL)


顺便问一下,我们谈论的是多少张唱片?如果我们处理的是1000条记录,那么期望这种类型的东西在几秒钟内运行肯定是合理的

请出示一些代码。您是否尝试过任何改进流程的方法?您是否使用分析器来测量执行时间?@Gordon我避免发布代码,因为它相当长。我只是用microtime()来看看它花了多长时间。我将发布一些代码asapCode上传。谢谢你迄今为止的回答!正如我所想的,加载到temp表中,并使用sqlselect/join将个体与事件相匹配。如果文件中有很多条目(几千)考虑使用“合并”语句,我还没有实现这一点,但它指向了我正确的方向。谢谢我没有想到这种方法。尽管如此,我还是使用自动生成的主键,因为有些事件具有相同的名称。您知道在数据库中输入正确的密钥后,分配这些密钥是否相对容易吗?[我的php比我的SQL更强大]测试数据在第一个文件中大约有300行,然后在第二个文件中有3000行。因此,有效地进行300*3000比较