【问题标题】:PHP : Find from tab delimited text file without while loopPHP:从制表符分隔的文本文件中查找没有while循环
【发布时间】:2014-05-30 13:47:18
【问题描述】:

我有一个制表符分隔的文本文件 (TXT),其中包含超过 100 万 行(记录)和大约 400 MB 文件大小

例子

demo    123333    new
demo2    3444442    new
demo4    56666632    old
demo5    455552333   new

所以现在我想找出 2nd tab 等于 "56666632"

的行

还将该行的所有制表符值转换为数组,如:

data[0]=>demo4
data[1]=>56666632
data[2]=>old

注意:我不想使用 while 和 foreach,因为 txt 文件中的行数非常多

我正在使用 while 循环尝试这段代码:

$file = "feed.txt";
$cols = array();
ini_set('auto_detect_line_endings', true);
$fh = fopen($file, 'r');
while (($line = fgetcsv($fh, 1000, "\t")) !== false) 
{ 
  if($line[1]=="56666632")
  {  
  var_dump($line);
  break;
  }
}

【问题讨论】:

  • 如果您明确排除允许您在 PHP 中逐行读取文件的选项,那么您可能仅限于操作系统搜索命令,如 grep.... 但为什么不你想使用循环吗?
  • 这可能会有所帮助stackoverflow.com/a/3686287/2045041
  • I want without while and foreach because very large number of line in txt file。这对我来说似乎是错误的,当你有大文件时,你想逐行这样做,否则你会陷入内存问题。

标签: php


【解决方案1】:

如果您使用的是 Linux 机器,您可以尝试将工作委托给 grep:

$line = shell_exec('grep -P "\t56666632\t" feed.txt');

【讨论】:

  • ... 而不是真正基于 php 的解决方案。
  • @MarcinOrlowski shell_exec 命令在 PHP 中使用 ...所以这是基于 php 的解决方案 :)
【解决方案2】:

如果没有 foreachwhile 循环,您将很难做到这一点。事实上,太难了,我什至不会浪费时间寻找答案

如果您使用的是类似 Unix 的机器,请使用 grep:

grep -nE \
  '^[^[:space:]]+[[:space:]]+56666632[[:space:]]+[^[:space:]]+' \
  feed.txt \
  | awk -F: '{print $1}'

正则表达式将按顺序搜索包含以下内容的字符串:

  • 至少有一个字符不是空白字符
  • 至少一个空格字符
  • 你的号码
  • 至少一个空格字符
  • 至少有一个字符不是空白字符

使用扩展的正则表达式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 1970-01-01
    • 2013-09-14
    • 2012-11-05
    相关资源
    最近更新 更多