我有一个文本文件,在我的文件
中22222 hihihi
33333 hihihi
kjhkh hihihi
我想编写一个与mysql数据库进行比较的应用程序,这样如果数据库中的ID
与文本文件中的第一列相同,它将通过用信息替换名称来更新数据在文本文件的第二列中。
我该怎么做?
答案 0 :(得分:1)
如上所述,字段由选项卡分隔,您可以将文件直接导入MySQL(假设id是该表的主键):
LOAD DATA INFILE 'data.txt' REPLACE INTO TABLE mytable (id,name);
(注意:这不仅会更新,还会添加条目)
答案 1 :(得分:1)
您可以尝试将数据加载到临时表中,运行更新,然后删除临时表 - 例如:
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;
(用DATA替换DXTX和用TABLE替换TXBLE - 就是这样,因为我的工作有一个过滤系统)
有关LOAD DATA的更多信息,请参阅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
上述代码的潜在问题:
请参阅http://php.net/manual/function.explode.php以及那里的mysql-query文档以获取更多信息
答案 2 :(得分:0)
您可以使用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()
函数 - 其手册页上有一个示例。
答案 3 :(得分:0)
如果你确定它总是5个字符,你可以简单地使用:
<?php
$ID = substr($varToEachLine, 0, 5);
?>
答案 4 :(得分:-1)
这似乎是一个分隔的文本文件。您可以使用文本驱动程序非常轻松地将数据加载到记录集中。我不是PHP,但我相信文本驱动程序适用于PHP。如果您的应用程序在Windows上运行,Microsoft Jet支持可用于将数据导入记录集的文本驱动程序。