如何使用php将数据从excel / csv导入数据库

时间:2015-11-17 06:24:49

标签: php mysqli

我想使用php将数据从excel / csv导入mysql数据库。主要问题是我在Excel中有超过15列,这些列与我的数据库的顺序不同。 那么有没有办法导入Excel没有特定的数据库模板?

2 个答案:

答案 0 :(得分:1)

试试这个......

将csv加载到MySQL或任何分隔的数据文件到MySQL数据库是一个非常常见的任务,经常受到质疑,几乎每次LOAD DATA INFILE都会被救出。

在本文中,我将向您解释所有不同的场景,并解释如何使用单个命令将数据从csv直接加载到MySQL数据库。

下载PDF教程:将数据CSV加载到MySQL

加载数据语法:

LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE ‘file_name’

[REPLACE | IGNORE]

INTO TABLE tbl_name

[CHARACTER SET charset_name]

[{FIELDS | COLUMNS}

[TERMINATED BY ‘string’]

[[OPTIONALLY] ENCLOSED BY ‘char’]

[ESCAPED BY ‘char’]

]

[LINES

[STARTING BY ‘string’]

[TERMINATED BY ‘string’]

]

[IGNORE number LINES]

[(col_name_or_user_var,…)]

[SET col_name = expr,…]

Consider we have to load file with following contents:

#File-name: example.csv

col-1,col-2,col-3

a,2,3

b,4,5

c,6,7

Excel文件可以通过“文件另存为”选项轻松导出为逗号分隔/分隔文件(csv)以加载数据。

  1. 带有列标题的简单逗号文件:
  2. 表结构:示例

    col-1 col-2 col-3

    考虑到我们的MySQL表具有相同的列序列,我们可以发出:

    LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES ;
    

    这是一个非常常见且简单的场景。

    快速更新:

    - 当然,如果我们在example.csv中没有列标题(col-1,col-2,col-3),则不需要IGNORE 1 LINES。

    - 注意文件路径。在这里你应该确保你的斜杠是正确的。

    您可以将路径指定为:C:\\path\\file.csv or C:/path/file.csv.

    - 如果我们要将数据文件加载到客户端(不在服务器上),我们将添加语法中给出的LOCAL关键字。

    因此,命令将变为:

    LOAD DATA LOCAL INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES ;
    

    - 如果我们想要通过从文件加载的数据替换现有数据,我们将在INTO TABLE之前添加REPLACE关键字。

    同样,如果我们想要跳过复制唯一键值上现有行的输入行,我们将在INTO TABLE之前使用IGNORE关键字。

    1. 文件和表格中的列序列不同。
    2. 表结构:示例

      col-2 col-1 col-3
      

      在这种情况下,我们需要指定csv文件的列名序列,以便将数据加载到正确的列中。

       LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES (col-1,col-2,col-3);
      
      1. csv / load数据文件的列数少于目标表
      2. 表结构:示例

        col-1 col-2 col-3 col-4

        考虑一下,col-1是自动递增的,不在csv中提供。

        LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES (col-2,col-3,col-4) set col-1=null;
        

        传递空值将使col-1采用自动增量值。

        使用SET可以为那些在csv中不可用且不为空的列赋值。

        您也可以使用函数执行某些特定任务并设置值。

        例如。 SET col-x=rand();

        1. 填写额外日期列:
        2. 这非常类似于3.在这里,我们需要col-4填充当前时间戳值,一个非常简单的方法是改变表:)

          ALTER TABLE example CHANGE COLUMN col-4 col-4 TIMESTAMP DEFAULT CURRENT_TIMESTAMP;
          

          然后,

          LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES (col-1,col-2,col-2=3) set col-4=null;
          

          它应该自动为我们填充current_timestamp值。

          1. 使用计算列加载数据:
          2. table:example

            col-1 col-2 col-3 col-4

            LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES (col-1,col-2,col-3, @var1) SET col-4 = @var1/100;
            

            类似地,我们也可以通过改变变量来改变字符串变量,如下所示:

            SET col-4 = replace(@var1,"find","replace")
            
            1. 使用表值查找加载csv:
            2. 考虑你有一个带有col1和col2数据的csv,第三列数据可以在另一个表中使用。您可以使用子查询加载引用的数据,如下所示。您必须确保获得单行作为回报,可以使用distinct或limit子句。

              LOAD DATA INFILE ‘path/to/example.csv’ INTO TABLE example FIELDS TERMINATED BY ‘,’ LINES TERMINATED BY ‘\n’ IGNORE 1 LINES (col-1,col-2) SET col-3 = (SELECT field-name FROM linkedTable where keyfield=col-1);
              
              1. 将分离的文件加载到MySQL的其他方法:
              2. CREATE TABLE csv_foo LIKE foo;

                ALTER TABLE csv_foo MODIFY COLUMN id INT(10) UNSIGNED NOT NULL;
                
                // remove auto increment
                
                ALTER TABLE csv_foo DROP PRIMARY KEY;
                
                // drop key as no keys are supported in csv storage engine
                

                或者你可以这样做:

                CREATE TABLE csv_foo AS SELECT * FROM FOO LIMIT 0;
                
                // Ignores key definitions and auto-increment
                
                
                
                // Make sure you don't have any nullable columns.
                

                现在,

                停止MYSQL服务器

                数据目录下的

                用可用的data-file.csv替换csv_foo.csv文件。 (将其重命名为csv_foo.csv)

                启动MYSQL服务器

                我们可能需要这样做:REPAIR TABLE csv_foo;

                嗯,这不是一个“好”的方式。

                1. 加载多个文件:
                2. 文档说MYSQL LOAD DATA将无法为我们做到这一点。

                  我们有一个单独的选项可用于相同的mysqlimport。

                  您可能需要参考:mysql-import

                  结论:我希望我们已经涵盖了一些主要有用的常见情景;休息将永远在这里得到解答。

                  通过下面的用户评论,您可能会获得典型负载数据或csv到mysql转换问题和可能解决方案的一些特定用例。

                  价:

                  http://kedar.nitty-witty.com/blog/load-delimited-data-csv-excel-into-mysql-server

答案 1 :(得分:0)

/**
 * @Route("/importcsv",name="importcsv" ,methods={"POST"})
 */
public function showfunc(Request $request, SluggerInterface $slugger)
{
    /** @var UploadedFile $brochureFile */
    $brochureFile = $request->files->get('filename');
    if ($brochureFile) {
        $originalFilename = pathinfo($brochureFile->getClientOriginalName(), PATHINFO_FILENAME);
        $safeFilename = $slugger->slug($originalFilename);
        $newFilename = $safeFilename . '-' . uniqid() . '.' . $brochureFile->guessExtension();
        $brochureFile->move($this->getParameter('image_dir'), $newFilename);
    }
    $reader = Reader::createFromPath($this->getParameter('image_dir') . $newFilename);
    $results = $reader->fetchAssoc();
    foreach ($results as $row) {
        $athlete = (new Emp())
            ->setName($row['name'])
            ->setDepartment($row['department'])
            ->setLocation($row['location'])
            ->setPhoto($row['photo']);
        $this->em->persist($athlete);
    }

    $this->em->flush();

    return $this->redirectToRoute('main');

}