如何取出每行的前5个字符?

时间:2011-03-17 07:36:53

标签: php mysql database text-files

我有一个文本文件,在我的文件

22222   hihihi
33333   hihihi
kjhkh   hihihi

我想编写一个与mysql数据库进行比较的应用程序,这样如果数据库中的ID与文本文件中的第一列相同,它将通过用信息替换名称来更新数据在文本文件的第二列中。

我该怎么做?

5 个答案:

答案 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

上述代码的潜在问题:

  • 非常大的文件:您需要一次读取和处理一行文件
  • 凌乱的数据:您可能需要优化或替换爆炸声明
  • 不安全数据:参数化查询并添加检查以避免SQL注入攻击
  • 慢:你正在进行大量的数据库调用;考虑首先描述的方法
  • 脆弱:您可以添加检查以查看更新是否成功

请参阅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支持可用于将数据导入记录集的文本驱动程序。