【问题标题】:PHP: How can I get the contents of a CSV file into a MySQL database row by row?PHP:如何将 CSV 文件的内容逐行放入 MySQL 数据库?
【发布时间】:2011-02-27 12:17:36
【问题描述】:

如何将 CSV 文件的内容逐行导入 MySQL 数据库?我尝试了几种方法,但使用 fgetcsv 永远无法返回超过一行。我尝试过的一种方法似乎非常接近工作:

    $fileName = $_FILES['SpecialFile']['name'];
    $tmpName = $_FILES['SpecialFile']['tmp_name'];
    $fileSize = $_FILES['SpecialFile']['size'];

    if(!$fileSize) 
    {
        echo "File is empty.\n";
        exit;
    }

    $fileType = $_FILES['SpecialFile']['type'];
    $file = fopen($tmpName, 'r');

    if(!$file) 
    {
        echo "Error opening data file.\n";
        exit;
    }

    while(!feof($file))
    {
        $data = str_replace('"','/"',fgetcsv($file, filesize($tmpName), ","));

        $linemysql = implode("','",$data);

        $query = "INSERT INTO $databasetable VALUES ('$linemysql')";

        return mysql_query($query);

    }

    fclose($file);

只输入一行,但如果我 print_r $data 它返回所有行。如何让它插入所有行?

另一种方法:

    $data = str_getcsv($csvcontent,"\r\n","'","");

    foreach($data as &$Row) 
    {
        $linearray = str_getcsv($Row,',',''); //parse the items in rows 

        $linemysql = implode("','",$linearray);

        echo $query = "INSERT INTO $databasetable VALUES ('$linemysql')";
    }

这几乎也可以,但是 csv 中的文本也包含新行,所以我不知道如何拆分实际行而不是文本中的新行。??

【问题讨论】:

  • 发布您正在使用的代码。您是否尝试过运行手册中显示的示例? docs.php.net/manual/en/function.fgetcsv.php
  • 您可以发布您尝试过的代码示例吗?此外,可以提供错误详细信息 - 如果有的话?这可能是您的脚本的问题,也可能是 MySQL 的表定义问题(常见的问题是未设置为自动递增的主键)。
  • 有什么理由不能使用加载数据 infile 吗? dev.mysql.com/doc/refman/5.0/en/load-data.html
  • 我是否遗漏了一些东西(没有多少 PHP 经验)- while 循环中的 return 语句不是解释了所描述的行为吗?这个循环怎么会运行不止一次?

标签: php mysql csv


【解决方案1】:

此函数从 csv 文件返回一个数组

function CSVImport($file) {
    $handle = fopen($file, 'r');
    if (!$handle)
        die('Cannot open  file.');
    $rows = array();
    //Read the file as csv
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {

        $rows[] =  $data

    }

    fclose($handle);

    return $rows;
}

// 这将返回一个数组 // 编写一些逻辑来读取数组并保存它

$csvArray = CSVImport($tmpName);
        if (count($csvArray)) {
             foreach ($csvArray as $key => $value) {

                  // $value is a row of adata 

              }
          }

【讨论】:

  • 这执行与已经存在的代码相同的功能,但是它仍然只返回 CSV 文件中 464 行中的 230 行。 :(
  • $csvArray = $this->CSVImport($tmpName); if (count($csvArray)) { foreach ($csvArray as $key => $value) { if($value != '') { $linemysql = implode("','",$value); } echo $query = "INSERT INTO $databasetable VALUES ('$linemysql') "; if(mysql_query($query) === false) { $errors++; } } }
  • 在您的情况下使用: LOAD DATA LOCAL INFILE 'myFile.csv' REPLACE INTO TABLE targetTable FIELDS TERMINATED BY ';'由 '\n' LOAD DATA DOCS 终止的行
  • @cranberies:问题是数据来自上传的文件,而不仅仅是一个位置。此外,除非该脚本知道数组数据中实际 /n 和 /n 之间的差异,否则它将失败。
  • 这确实取决于上传文件的内容,但我稍后会尝试确定。
【解决方案2】:

我想这就是你要找的。​​p>

function getCSVcontent($filePath) {
    $csv_content = fopen($filePath, 'r');

    while (!feof($csv_content)) {
        $rows[] = fgetcsv($csv_content,1000,";");
    }
    fclose($csv_content);
    return $rows;
}

确保你的换行符是“;”或者给 fgetcsv() 一个正确的值。问候。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2014-05-03
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多