PHP在CSV文件中查找字符串

时间:2011-06-21 14:15:33

标签: php arrays

我有一个大型的用户名和电子邮件平面文件,格式如下:

"username", "email"
"username", "email"
"username", "email"

等...

我需要接收电子邮件并搜索用户名,但由于某种原因,它不会返回结果。如果我在对面搜索,它就有用。

$string = "user_email@something.com";
$filename = "user_email.txt";
        $h = fopen("$filename","r");
        $flag=0;

        while (!feof ($h)) {
            $buffer = fgets($h);
            $thisarray = split(",", $buffer);

            if ($string == str_replace('"','', $thisarray[1])) { 
                $i = 1;
                $i++;
                echo '<td bgcolor="#CCFFCC"><b style="color: maroon">' . str_replace('"','',$thisarray[0]). '</b></td>';

                }   

有什么想法吗?谢谢!

6 个答案:

答案 0 :(得分:9)

根据reko_t的建议:使用fgetcsv将csv的各行读入数组,直到找到第二个元素与搜索词匹配的行。然后第一个元素是用户名。类似的东西:

<?php
function find_user($filename, $email) {
    $f = fopen($filename, "r");
    $result = false;
    while ($row = fgetcsv($f)) {
        if ($row[1] == $email) {
            $result = $row[0];
            break;
        }
    }
    fclose($f);
    return $result;
}

答案 1 :(得分:2)

您可以直接使用fgetcsv()

$string = "user_email@something.com";
$filename = "user_email.txt";
$h = fopen("$filename","r");
$flag=0;

while (!feof ($h)) {
    list($username, $email= fgetcsv($h);

    if ($string == $email) { /* do something */ }
}

fgetcsv()(作为一个很好的副作用)也会删除“字段附件”(双引号"),如果它们存在的话。

你自己的例子可能不起作用,因为如果你有这样一行

"username", "email"

,分割将导致

'"username"'
' "email"'

注意"email"之前的空格,您忘记删除。额外使用str_replace()删除周围的引号是非常不安全的。看看trim()

答案 2 :(得分:0)

首先,只需使用file()将文件内容转换为数组:

$file_contents = file( $filename, 'r' );

现在循环遍历数组的内容,拆分字符串并检查电子邮件地址:

foreach ( $file_contents as $line ) {
    list ( $username, $email ) = str_split( ',' $line );
    if ( trim( $email ) == $string ) {
        // A match was found. Take appropriate action.
    }
}

答案 3 :(得分:0)

我认为最简单的解决方案是使用带有str_getcsv()的file()。

代码将是这样的:

foreach (file($fileName, FILE_SKIP_EMPTY_LINES) as $line) {
    $columns = str_getcsv($line); // Where $columns[0] and $columns[1] hold the username and email respectively.
}

答案 4 :(得分:0)

虽然fgetcsv可能是一个更优雅的解决方案,但它没有回答你原来的问题:你的第二个数组元素有一个换行符,你正在与一个没有换行符的字符串进行比较。

修复:

if ($string == str_replace('"','', chop($thisarray[1]))) {

答案 5 :(得分:0)

我真的相信其他答案中的所有例子都有效!
但它们都是,因为它们都遍历csv文件中的每一行......
我还有另一个例子,如何找到所需的字符串:

$command = sprintf("grep '%s,%s' -Er %s", $userName, $email, $file);
$result = `$command`;

是的,它是某种暗物质,但它确实有效,它确实快速