【问题标题】:PHP import csv to mysql issuePHP导入csv到mysql问题
【发布时间】:2013-11-19 23:37:22
【问题描述】:

我有一个包含将近 8000 行的 csv 文件。我需要在数据库中插入一些列。为此,我使用以下代码:

$csv_file = $_FILES[file][tmp_name];
$csvfile = fopen($csv_file, 'r');
$theData = fgets($csvfile);
$i = 0;
while (!feof($csvfile))
{
        $csv_data[] = fgets($csvfile, 1024);
        $csv_array = explode(",", $csv_data[$i]);
        $insert_csv = array();
        $insert_csv['code'] = $csv_array[6];
        $insert_csv['description'] = $csv_array[7];
        $insert_csv['rrp'] =$csv_array[8];
        $insert_csv['buy'] = $csv_array[9];
        $insert_csv['stock'] = $csv_array[11];
        if($insert_csv['code']!="" && $insert_csv['description']!="" && $insert_csv['rrp']!="" || $insert_csv['buy']!="" || $insert_csv['stock']!="")
        {
            $query = "INSERT INTO pricing (code, description,rrp,buy,stock,distributor,vendor,version) VALUES
                     ('".$insert_csv['code']."','".$insert_csv['description']."','".$insert_csv['rrp']."','".$insert_csv['buy']."','".$insert_csv['stock']."',
                     '".$d."','".$v."','".$version."')";
            $n=mysql_query($query, $con);
        }
        $i++;
}
    fclose($csvfile);
    header('Location: import.php?success=1'); die;

但问题是,有时某些列本身具有逗号分隔值。所以使用我的代码插入数据库很困难。所以插入的值会是错误的列值。

例如:

正确的csv数据:(这将正确插入数据库)

2132,JUNIPER,CONTENT SUBSCRIPTIONS,First Year Subscriptions,A,GEN,SRX220-IDP,1 年 IDP 更新许可证 SRX 220,951.3514,599.3514,37%,0,0,0,0,31/ 10/13 21:16,0,21

但有时 csv 文件包含以下行格式:

这里的 $csv_array[2] 本身有逗号分隔的值,但被引号覆盖。我的代码只是在寻找逗号。所以 db 表中的插入值会有所不同。

2132,JUNIPER,"J, SRX, AX, VGW",Base System,A,GEN,AX411-KR,韩国双射频 802.11abgn 接入点。不包括电源.,805.4054,507.4054,37.01%,0,0,0,0,31/10/13 21:16,0,21

我该如何解决?

谢谢!

更新

if ($_FILES[file][size] > 0)
        {
            //get the csv file
            $file = $_FILES[file][tmp_name];
            $handle = fopen($file,"r");
            fgetcsv($handle,10000,",");
            //loop through the csv file and insert into database
            do
            {
                if ($data[0])
                {
                    mysql_query("INSERT INTO pricing (code, description,rrp,buy,stock,distributor,vendor,version) VALUES
                (
                    '".addslashes($data[6])."',
                    '".addslashes($data[7])."',
                    '".addslashes($data[8])."',
                    '".addslashes($data[9])."',
                    '".addslashes($data[11])."',
                    '".$d."',
                    '".$v."',
                    '".$version."'
                )
            ");
                }
            } while ($data = fgetcsv($handle,1000,',','"'));

            header('Location: import.php?success=1'); die;

        }

【问题讨论】:

    标签: php mysql file csv


    【解决方案1】:

    您应该使用csv 函数而不是explode

    甚至直接加载csv文件到mysql

    手册中跳过某些列的示例

    您还可以通过将输入值分配给用户变量而不将变量分配给表列来丢弃输入值:

    LOAD DATA INFILE 'file.txt'
      INTO TABLE t1
      (column1, @dummy, column2, @dummy, column3);
    

    【讨论】:

    • 我之前没有尝试过 LOAD DATA INFILE。使用此命令如何将选定的列插入数据库?这可能吗?
    • 将文件上传到/tmp 文件夹(所有系统用户均可访问)并使用类似LOAD DATA INFILE '/tmp/data.csv' INTO TABLE pricing FIELDS TERMINATED BY ','
    • 让我看看。谢谢
    【解决方案2】:

    您忽略了文件中的引号。 php 的 fgetcsv 允许您从 csv 文件中读取文件,它会尊重字符串周围的引号

    array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] )
    

    适应您的用例(使用逗号分隔字符串和双引号),用作

    while (($data = fgetcsv($csvfile, 1000, ",",'"')) !== FALSE) {
    

    表面上读取 CSV 文件看起来很容易,实际上有许多特殊情况需要考虑,这就是为什么使用标准、经过良好测试和多功能的函数始终是您的最佳选择。

    【讨论】:

    • 我已经在文本编辑器中检查了我的 csv 文件。但并非每个字段都用双引号覆盖。有什么问题吗?
    • @NewPHP 否,请参阅RFC4180,它与 CSV 段落 2.5、2.6 和 2.7 的标准最接近。引号是可选的,但包含双引号、逗号和换行符的字段除外 - 在您的情况下,仅对第二个字段如此,因此可以只对该字段进行双引号。
    【解决方案3】:

    这是将 CSV 文件导入 mysql 且没有重复记录的最佳代码,它显示插入了多少记录以及有多少重复记录的结果

    <?php
        $duplicate=0;
        $record=0;
        $total=0;
        $conn=mysql_connect("localhost","","","") or die(mysql_error());
        mysql_select_db("svn",$conn);
        ini_set('max_execution_time', 300);
        if(isset($_POST['submit']))
        {
        $file=$_FILES['file']['tmp_name'];
    
        $handle=fopen($file,"r");
        while(($fileop=fgetcsv($handle,1000,",")) !== false)
        {
        if(! get_magic_quotes_gpc() )
        {
        $fn= addslashes ($fileop[0]);
        $ln=addslashes ($fileop[1]);
        $ti=addslashes ($fileop[2]);
        $ac=addslashes ($fileop[3]);
        $em=addslashes ($fileop[4]);
        $op=addslashes ($fileop[5]);
        $mp=addslashes ($fileop[6]);
        $fx=addslashes ($fileop[7]);
        $ad=addslashes ($fileop[8]);
        $co=addslashes ($fileop[9]);
        $st=addslashes ($fileop[10]);
        $ci=addslashes ($fileop[11]);
        $zc=addslashes ($fileop[12]);
        }
        else
        {
        $fn= $fileop[0];
        $ln=$fileop[1];
        $ti=$fileop[2];
        $ac=$fileop[3];
        $em=$fileop[4];
        $op=$fileop[5];
        $mp=$fileop[6];
        $fx=$fileop[7];
        $ad=$fileop[8];
        $co=$fileop[9];
        $st=$fileop[10];
        $ci=$fileop[11];
        $zc=$fileop[12];
        }
    
    
        $query=mysql_query("SELECT * FROM test WHERE email='$em'");
         if(mysql_num_rows($query)>0)
          {
    
           $duplicate=$duplicate+1;
          }
        else
          {
          $record=$record+1;
        $sql=mysql_query("INSERT INTO test(first_name,last_name,title,account,email,officephone,mobphone,fax,address,country,state,city,zipcode) 
        VALUES('$fn','$ln','$ti','$ac','$em','$op','$mp','$fx','$ad','$co','$st','$ci','$zc')");
        }
        }
    
        echo"Data inserted successfully";
    
        echo "<table width='600' cellpadding='5' cellspacing='5' border='1'>";
        echo "<tr>"."<td>"."Record inserted"."</td>"."<td>".$record."</td>"."</tr>";
        echo "<tr>"."<td>"."duplicate record"."</td>"."<td>".$duplicate."</td>"."</tr>";
        echo "<tr>"."<td>"."Total records"."</td>"."<td>".$total=$record + $duplicate."</td>"."</tr>";
        echo "</table>";
    
    
        }
    
        ?>
        <!DOCTYPE html>
        <html lang="en">
        <head>
        <meta charset="utf-8">
        <?
        $duplicate=0;
        $record=0;
        $total=0;
        ?>
        </head>
        <body>
    
        <form action="index.php" method="post" enctype="multipart/form-data">
         <input type="file" name="file" value="selectfile"/><br/>
            <input type="submit" name="submit" value="Submit" />
        </form>
        </body>
        </html>
    

    【讨论】:

      猜你喜欢
      • 2014-10-17
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2016-05-07
      • 2012-11-30
      相关资源
      最近更新 更多