2011-06-21 26 views
7

Tengo un archivo plano grande de nombres de usuario y mensajes de correo electrónico en el siguiente formato:PHP Buscar cadena en el archivo CSV

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

etc ...

tengo que tomar el correo electrónico y la búsqueda de el nombre de usuario, pero por alguna razón no devolverá un resultado. Funciona si busco opuesto.

$string = "[email protected]"; 
$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>'; 

       } 

¿Alguna idea? ¡Gracias!

+0

Puede usar 'fgetcsv' para leer la línea CSV desde un manejador de archivo: http://php.net/fgetcsv –

+0

posible duplicado de [PHP Leer CSV y filtrar por fecha] (http://stackoverflow.com/questions/2127775/php-read-csv-and-filter-by-date # 2128053) – Gordon

Respuesta

6

Según la sugerencia de reko_t: Use fgetcsv para leer líneas individuales de csv en matrices, hasta que encuentre una donde el segundo elemento coincida con su término de búsqueda. El primer elemento es el nombre de usuario. Algo así como:

<?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; 
} 
+0

funcionó perfecto! gracias :) –

+0

gracias su trabajo adecuado para mí ... – pratik

1

Es posible utilizar directamente fgetcsv()

$string = "[email protected]"; 
$filename = "user_email.txt"; 
$h = fopen("$filename","r"); 
$flag=0; 

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

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

fgetcsv() (como un bonito efecto secundario) también elimina los "cierres de campo" (las comillas dobles ") para que, si existe.

Su propio ejemplo, probablemente no funciona, porque si usted tiene una línea tan

"username", "email" 

a dividir en , dará lugar a

'"username"' 
' "email"' 

Aviso del espacio en blanco antes "email", que se olvidó de quitar . El uso adicional de str_replace() para eliminar las comillas circundantes es bastante inseguro. Eche un vistazo al trim().

+0

Además, si solo necesita ir hasta que se encuentre el correo electrónico y luego detenerlo, agregue un descanso; declaración al final de la declaración if. – Joseph

0

En primer lugar, sólo tiene que utilizar el archivo() para obtener el contenido del archivo en una matriz:

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

Ahora recorren el contenido de la matriz, la división de las cuerdas y que examinan la dirección de correo electrónico:

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

creo que la solución más sencilla es utilizar el archivo() con str_getcsv().

El código sería algo como esto:

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. 
} 
0

Mientras fgetcsv es potencialmente una solución más elegante, que no responde a su pregunta original: el segundo elemento de matriz tiene una nueva línea, y que está comparando contra una cuerda que no.

Fijar:

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

creo sinceramente que todos los ejemplos en otras respuestas funciona!
Pero todos son lento, porque todos ellos atraviesan cada línea en el archivo csv ...
tengo otro ejemplo de cómo encontrar cadena deseada:

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

Sí, algún tipo de materia oscura, pero realmente funciona y lo que realmente rápido !