我有一个文本文件,在我的文件里面
22222 hihihi
33333 hihihi
kjhkh hihihi
我想写一个与mysql数据库进行比较的应用程序,这样如果我在数据库中的ID
与文本文件中的第一列相同,它将通过用文本文件中第二列中的信息替换名称来更新数据。
我该怎么做呢?
发布于 2011-03-18 12:49:59
如上所述,字段由制表符分隔,您可以直接将文件导入MySQL (假设id是该表的主键):
LOAD DATA INFILE 'data.txt' REPLACE INTO TABLE mytable (id,name);
(注意:这不仅会更新条目,还会添加条目)
发布于 2011-06-13 17:42:17
您可以尝试将数据加载到临时表中,运行更新,然后删除临时表-类似于:
CREATE TABLE dftmp(id VARCHAR(255), name VARCHAR(255));
LOAD DXTX INFILE 'datafile.txt' INTO TABLE dftmp(id,name);
UPDATE real_table,dftmp SET real_table.name=dftmp.name WHERE real_table.id=dftmp.id;
DROP TXBLE dftmp;
(将DXTX替换为DATA,将TXBLE替换为TABLE -上面方式是因为我的工作有一个适当的过滤系统)
有关加载数据的更多信息,请参见http://dev.mysql.com/doc/refman/4.1/en/load-data.html。
主要在PHP中处理可能会比较慢,但如果您需要这样做,那么应该是这样的:
# make database connection
# open file and get it's contents
$lines = file('datafile.txt');
# for each line in the file
# split the line into its parts
# update the DB
foreach ($lines as $line) {
$line_ar = explode("/\s+/",$line);
mysql_query("UPDATE t SET name='$line_ar[1]' WHERE id='$line_ar[0]'");
}
# close the database connection
以上代码的潜在陷阱:
对于非常大的文件:您需要一次读取和处理一行混乱的数据文件:您可能需要细化或替换分解的statement
:您正在进行大量的db调用;考虑最先描述的方法instead
有关更多信息,请参阅http://php.net/manual/function.explode.php和mysql-query文档
发布于 2011-03-17 07:41:47
您可以使用explode()
将字符串拆分成几行;然后,对于每一行,使用preg_match()
函数使用一个简单的正则表达式来匹配您感兴趣的部分。
例如,如下所示:
$str = <<<STR
22222 hihihi
33333 hihihi
kjhkh hihihi
STR;
foreach (explode(PHP_EOL, $str) as $line) {
if (preg_match('/^([^\s]+)\s+(.*)$/', $line, $m)) {
var_dump($m[1], $m[2]);
}
}
会给你带来:
string '22222' (length=5)
string 'hihihi' (length=6)
string '33333' (length=5)
string 'hihihi' (length=6)
string 'kjhkh' (length=5)
string 'hihihi' (length=6)
关于我使用的正则表达式的注意事项:
字符串开头:^
[^\s]
[^\s]
:^
[^\s]+
\s
\s+
.*
(.*)
最后,字符串的结尾:$
:
现在,当您将文件作为输入而不是字符串处理时,您可能希望逐行读取文件,而不是将整个文件提取到内存中;有关这一点,请参阅fgets()
函数--其手册页面上有一个示例。
https://stackoverflow.com/questions/5336173
复制