我正在编写一个脚本来将csv导入MySQL。 csv将具有可变数量的字段,不同的数据类型和字段大小。
我目前的计划是通过csv并收集统计信息以通知MySQL CREATE TABLE查询。
我的想法是以这种格式创建一个数组:
$csv_table_data = array(
['columns'] => array(
[0] => array(
['min_size'] = int,
['max_size'] = int,
['average'] = int
['type'] = string
),
[1] => array(
['min_size'] = int,
['max_size'] = int,
['average'] = int
['type'] = string
),
[2] => array(
['min_size'] = int,
['max_size'] = int,
['average'] = int
['type'] = string
),
),
['some_other_data'] = array()
);
因此,通过访问$ csv_table_data ['columns'] [$ i],我可以访问每个列的属性并使用它来创建MySQL表。除了$ csv_table_data ['columns']我还有其他数据,如total_rows,number_of_fields,并可能会添加更多。
我可以一次收集所有这些数据,创建适当的表,然后在第二遍中填充它。
我没有使用太多面向对象的编程,但是对于所有这些数据,我应该考虑创建一个具有这些不同属性的对象,而不是创建这个复杂的数组吗?
您对可读性,可维护性,执行速度以及您遇到的任何其他注意事项有何看法?
由于
答案 0 :(得分:1)
我认为你应该使用Classes,而不仅仅是一个大的Object。也许你把它分成2或3个类。它只是阵列更清洁。
像这样的东西
class Table{
private $data = array();
private $otherData = 'what_ever';
public function getData(){
return $this->data;
}
public function addData(Row $row){
$this->data[] = $row;
}
//Add getter and setter
}
class Row{
private $min_size;
private $max_size;
private $avg_size;
private $type;
public function setMinSize($minSize){
$this->min_size = $minSize;
}
public function getMinSize(){
return $this->min_size;
}
//Add more getter and setter
}
答案 1 :(得分:0)
如果您要插入的文件数量有限,则可以使用MySql的内部函数。 要导入数据文件,首先将其上传到您的主目录,以便该文件现在位于我们本地系统上的/importfile.csv中。然后在mysql提示符下键入以下SQL: LOAD DATA LOCAL INFILE'/importfile.csv' INTO TABLE test_table 字段被','终止 由'\ n'终止的线路 (field1,filed2,field3);
上面的SQL语句告诉MySQL服务器在LOCAL文件系统上找到你的INFILE,将文件的每一行作为一个单独的行读取,将任何逗号字符视为列分隔符,并将其放入MySQL test_table中分别为field1,field2和field3。上面的许多SQL子句都是可选的,你应该阅读关于正确使用这个语句的MySQL文档。
另一方面,如果你有许多文件,或者你想让用户上传csv然后将它们添加到数据库中,我推荐使用'array'版本,因为它似乎更容易遍历。
干杯, 丹尼斯