2009-09-03 141 views

Respuesta

32

A partir de PHP 5.3, puede usar str_getcsv() para leer líneas individuales utilizando diferentes delimitadores.

$someCondition = someConditionToDetermineTabOrComma(); 

$delimiter = $someCondition ? "," : "\t"; 

$fp = fopen('mydata.csv', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data = str_getcsv($line, $delimiter); 

    doSomethingWithData($data); 
}        

fclose($fp); 
+0

Vine a una solución similar. Leo el archivo y busco la pestaña; si no se encuentra, supongo que el delimitador es una coma. Entonces use getscv como versión de php es 5.2. Aunque veo algunos defectos en esto, no puedo pensar en nada mejor. – veli

+0

Quizás cuente las pestañas y comas (y otros delimitadores potenciales) en la primera línea, luego compárelos con la segunda línea y así sucesivamente. Lo que sea más consistente es su delimitador probable. Una solución de dos pasos, desafortunadamente, pero ese es a menudo el camino cuando tienes un desconocido. – Rikki

0

Lea todo el archivo, o línea por línea, y divídalo mediante división.

Allí puede incluir una expresión regular con delimitadores arbitrarios. No he PHP aquí para probar una declaración, pero php.net -> buscar para split(). Allí también tiene un comentario relacionado con regex.

+0

Pero ese método eliminaría la funcionalidad del recinto getcsv, probablemente derrotar el propósito de todos, pero el más simple de archivos CSV. – dimo414

0

puede probar explode

explode (string $delimiter , string $string [, int $limit ]); 
+0

En archivo separado por comas, puede haber comas dentro de comillas que no se consideran delimitadores. Es por eso que quiero usar getscv, ya que maneja esto correctamente. – veli

+0

Esta sigue siendo una solución viable siempre que sepa los datos con los que está trabajando. También los datos de los formatos csv son calificados con doble cita: esto evita problemas con la explosión. No es digno de un voto negativo. También este código es muy común en la naturaleza para analizar datos CSV ... – Radmation

9

Se puede especificar un delimitador para fgetcsv(). Este es un ejemplo de la lectura de archivos delimitados por tabuladores,

while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) { 
    ... 
} 
+0

Sí, pero también puede ser un archivo csv. El problema es cómo saber con certeza si se trata de csv o pestaña delegada. – veli

2

Aquí es un ejemplo que leer mydata.txt campos CSV

$tab = "\t"; 

$fp = fopen('mydata.txt', 'r'); 

while (!feof($fp)) 
{ 
    $line = fgets($fp, 2048); 

    $data_txt = str_getcsv($line, $tab); 

    //Get First Line of Data over here 
    print_r($data_txt); 
    exit; 
}        

fclose($fp); 
+0

Este es uno bueno. –

0

Esta es la función que he añadido a mi biblioteca utilidades para su uso futuro. Lo obtuve de NSSec's answer.

Esta solución le permite especificar si desea usar la primera línea como claves para la matriz. Probablemente agregaré la capacidad de pasar una matriz para usar en el momento de las claves del parámetro $ first_line_keys.

/** 
* Converts a CSV file into an array 
* NOTE: file does NOT have to have .csv extension 
* 
* $file - path to file to convert (string) 
* $delimiter - field delimiter (string) 
* $first_line_keys - use first line as array keys (bool) 
* $line_lenght - set length to retrieve for each line (int) 
*/ 
public static function CSVToArray($file, $delimiter = ',', $first_line_keys = true, $line_length = 2048){ 

    // file doesn't exist 
    if(!file_exists($file)){ 
     return false; 
    } 

    // open file 
    $fp = fopen($file, 'r'); 

    // add each line to array 
    $csv_array = array(); 
    while(!feof($fp)){ 

     // get current line 
     $line = fgets($fp, $line_length); 

     // line to array 
     $data = str_getcsv($line, $delimiter); 

     // keys/data count mismatch 
     if(isset($keys) && count($keys) != count($data)){ 

      // skip to next line 
      continue; 

     // first line, first line should be keys 
     }else if($first_line_keys && !isset($keys)){ 

      // use line data for keys 
      $keys = $data; 

     // first line used as keys 
     }else if($first_line_keys){ 

      // add as associative array 
      $csv_array[] = array_combine($keys, $data); 

     // first line NOT used for keys 
     }else{ 

      // add as numeric array 
      $csv_array[] = $data; 

     } 

    } 

    // close file 
    fclose($fp); 

    // nothing found 
    if(!$csv_array){ 
     return array(); 
    } 

    // return csv array 
    return $csv_array; 

} // CSVToArray() 
0
$filePath = "somefile.txt"; 
$delimiter = "\t"; 

$file = new \SplFileObject($filePath); 
while (!$file->eof()) { 
    $line = $file->fgetcsv($delimiter); 
    print_r($line); 
} 
+0

Agregue algunas explicaciones a su respuesta para que sea más valiosa para otros usuarios. – wmk

Cuestiones relacionadas