首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何提取每行的前5个字符?

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

Stack Overflow用户
提问于 2011-03-17 15:36:53
回答 5查看 420关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
复制
22222   hihihi
33333   hihihi
kjhkh   hihihi

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

我该怎么做呢?

EN

回答 5

Stack Overflow用户

发布于 2011-03-18 20:49:59

如上所述,字段由制表符分隔,您可以直接将文件导入MySQL (假设id是该表的主键):

代码语言:javascript
代码运行次数:0
运行
复制
LOAD DATA INFILE 'data.txt' REPLACE INTO TABLE mytable (id,name);

(注意:这不仅会更新条目,还会添加条目)

票数 1
EN

Stack Overflow用户

发布于 2011-06-14 01:42:17

您可以尝试将数据加载到临时表中,运行更新,然后删除临时表-类似于:

代码语言:javascript
代码运行次数:0
运行
复制
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中处理可能会比较慢,但如果您需要这样做,那么应该是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
# 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

  • unsafe数据:参数化查询并添加检查以避免SQL注入攻击

:您正在进行大量的db调用;考虑最先描述的方法instead

  • fragile :您可以添加检查以查看更新是否成功

有关更多信息,请参阅http://php.net/manual/function.explode.php和mysql-query文档

票数 1
EN

Stack Overflow用户

发布于 2011-03-17 15:41:47

您可以使用explode()将字符串拆分成几行;然后,对于每一行,使用preg_match()函数使用一个简单的正则表达式来匹配您感兴趣的部分。

例如,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
$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]);
  }
}

会给你带来:

代码语言:javascript
代码运行次数:0
运行
复制
string '22222' (length=5)
string 'hihihi' (length=6)
string '33333' (length=5)
string 'hihihi' (length=6)
string 'kjhkh' (length=5)
string 'hihihi' (length=6)

关于我使用的正则表达式的注意事项:

字符串开头:^

  • matches任何非白色字符(制表符、换行符、空格):

  • [^\s]
  • one or more [^\s]^
  • matches it:[^\s]+
  • capturing

  • 匹配任何白色字符:\s
    • 一次或多次:\s+

  • 匹配任意次数:捕获它的.*
    • (.*)

最后,字符串的结尾:$

现在,当您将文件作为输入而不是字符串处理时,您可能希望逐行读取文件,而不是将整个文件提取到内存中;有关这一点,请参阅fgets()函数--其手册页面上有一个示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5336173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档