我有一个 csv 文件,它在一列中包含 2000 个数据。数据格式如下:
name 100/1
name 100/2
name 105/6
...
所以一般格式是'text integer_one/integer_two' 现在我希望它存储在一个有 2 列的 mysql 数据库表中。column_1 应该有数据 integer_one,column_2 应该有数据 integer_two
如何使用 php 将数据推送到 mysql 中?
看看 preg_match,你应该能够使用一个相当简单的正则表达式来获取这些值,比如:
preg_match(/\w+\s*(\d+)\\\/(\d+)/, $row, $matches);
var_dump($matches);
要从文件中提取数据,请查看fgets
逐行读取文件以获取$row
上述代码中的变量的示例。
然后,您可以使用 INSERT 语句将每一行写入数据库。
需要考虑的一些事项:
文件有多大?您需要多久插入一次此数据 - 是一次性的吗?
这些东西会影响你构建代码的方式;有多种方法可以批量插入数据,如果这只是一次性运行,那么我建议使用sed
或类似方法操作文本数据,然后使用您选择的数据库的本机方法进行批量插入(对于 mysql,请参阅LOAD DATA INFILE
,或使用\.
客户端中的选项)
如果文件很大并且您需要定期插入内容,请查看使用准备好的语句和/或多重插入语法:
INSERT INTO mytable (name, number, anothernumber) VALUES('paul', 1, 2),('bob',2,1)
首先从提取你的价值观开始。如果您的所有数据都像您的示例一样格式化,您可以使用简单的explode
.
$lines = explode(",", $data); // $data should be your file extracted into a string
foreach ($lines as $line) {
$temp = explode(" ", $line);
$name = $temp[0];
$temp_2 = explode("/", $temp[1]);
$integer_1 = $temp_2[0];
$integer_2 = $temp_2[1];
$query = "INSERT INTO table_two_columns SET name = '{$name}', integer_1 = '{$integer_1}', integer_2 = '{$integer_2}'";
}
好吧,这就是我对你的问题的看法。
看看fopen()和fread()或fgetcsv() php 函数来处理文件,使用它们你应该能够遍历 cvs 文件的行,如果你可以控制你的服务器配置,我会建议您可以改为查看SplFileObject,因为您可以更高效/更优雅地处理文件,并且面向对象。但要求您启用 SPL。最后一个是我的建议,因为您可以像这样阅读文件:
function random_name(){
$file_name = "names.csv";
if(is_readable($file_name)){
$file = new SplFileObject($file_name);
$file->seek($file->getSize());
$linesTotal = $file->key();
$file->seek(rand(1,$linesTotal-1));
$line = $file->fgetcsv();
return $line[4];
}
}
这是我的一个示例脚本,用于从 1000 个名称的 cvs 文件中获取随机名称。
当您循环并获取文件信息时,您可以使用explode(),此函数通过您定义的分隔符分隔您的字符串,在您的情况下它将是:
$array = explode("/", $myLine);
你会像这样访问:
$array[0] or $array[1] to get the value