我想使用php将数据从excel / csv导入mysql数据库。主要问题是我在Excel中有超过15列,这些列与我的数据库的顺序不同。 那么有没有办法导入Excel没有特定的数据库模板?
答案 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)以加载数据。
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关键字。
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);
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();
这非常类似于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值。
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")
考虑你有一个带有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);
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;
嗯,这不是一个“好”的方式。
文档说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');
}