使用其他文本文件过滤文本文件

时间:2016-02-24 14:42:51

标签: php file

我有两个文本文件,我需要使用file2过滤file1并将结果放在file3中。<​​/ p>

文件1:

1232131-72-427-Q john johnson -----more data----------more data-----
8765438-43-542-T peter dudeson -----more data----- -----more data-----
3456761-21-742-G frank zena -----more data----------more data-----
0924560-23-124-O marin franklin -----more data----------more data-----
2345333-21-423-P pin dudeson-----more data----------more data-----
5434225-21-983-A chow ching -----more data----------more data-----

file2的:

8765438-43-542-T
0924560-23-124-O
5434225-21-983-A

file3(预期输出):

8765438-43-542-T peter dudeson-----more data----------more data-----  
0924560-23-124-O marin franklin-----more data----------more data----- 
5434225-21-983-A chow ching-----more data----------more data----- 

所以基本上它必须检查file1中file2的数字+字符并删除所有不匹配的行,并保留匹配的完整行并将它们放入file3。

我希望有人能帮助我,因为我现在已经坚持了很长时间。 (顺便说一句:必须在不使用explode()功能的情况下完成)

3 个答案:

答案 0 :(得分:1)

不知道为什么你不能使用explode(),但这应该适合你:

首先,我们将两个文件放入一个file()的数组中,如下所示:

Array
(
    [0] => 1232131-72-427-Q john johnson -----more data----------more data-----
    [1] => 8765438-43-542-T peter dudeson -----more data----- -----more data-----
    [2] => 3456761-21-742-G frank zena -----more data----------more data-----
    [3] => 0924560-23-124-O marin franklin -----more data----------more data-----
    [4] => 2345333-21-423-P pin dudeson-----more data----------more data-----
    [5] => 5434225-21-983-A chow ching -----more data----------more data-----
)

然后我们使用array_filter()过滤第一个文件和第二个文件。我们遍历每一行并检查文件一行中第一个空格的子字符串是否在文件二的数组中。

示例:

Substring which we want to get with substr(), until the first space
┌──────┴───────┐
8765438-43-542-T peter dudeson -----more data----- -----more data-----
                ↑
Getting the position of the first space with strpos()
Now checking with in_array() if the substring,
which we got is in the array from the second file

               8765438-43-542-T
                      ↓
Array ( [0] => 8765438-43-542-T [1] => 0924560-23-124-O [2] => 5434225-21-983-A )

如果子串在数组中,我们将返回true并在结果数组中保留整行。

最后,我们只需将数组保存到file_put_contents()implode()数组的文件中,然后使用新行。

代码:

<?php

    $input = file("PATH/TO/file1", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    $filter = file("PATH/TO/file2", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

    $result = array_filter($input, function($line)use($filter){
        if(in_array(substr($line, 0, strpos($line, " ")), $filter))
            return TRUE;
        return FALSE;
    });

    file_put_contents("PATH/TO/file3", implode(PHP_EOL, $result));

?>

答案 1 :(得分:0)

在linux中,简单地将脚本粘贴到命令中:

for filter in `cat file2`;do grep $filter file1 ; done > file3

答案 2 :(得分:0)

将每个文件拆分为一个数组(按新行),如果第一个(第一个空格之前)不在第二个文件中,则删除它:

$file1 = "1232131-72-427-Q john johnson -----more data----------more data-----
8765438-43-542-T peter dudeson -----more data----- -----more data-----
3456761-21-742-G frank zena -----more data----------more data-----
0924560-23-124-O marin franklin -----more data----------more data-----
2345333-21-423-P pin dudeson-----more data----------more data-----
5434225-21-983-A chow ching -----more data----------more data-----";

$file2 = "8765438-43-542-T
0924560-23-124-O
5434225-21-983-A";

// Get each row of file1 & file2 as arrays.
$rows1 = explode("\r\n", $file1);
$rows2 = explode("\r\n", $file2);
$result = $rows1;

foreach ($rows1 AS $key => $row) {
    // If the text before the first space is not a value in the $rows2 array, delete it.
    if (!in_array(substr($row, 0, strpos($row, ' ')), $rows2)) {
        unset($result[$key]);
    }
}

var_dump($result);

您可能需要将爆炸定界符修改为\n而不是\r\n,具体取决于您的主机。

希望这能让您了解如何解决这个问题以及解决方案。