2010-05-10 12 views
12

Tengo un archivo csv que se parece a esteCómo extraer datos de archivo CSV en PHP

$lines[0] = "text, with commas", "another text", 123, "text",5; 
$lines[1] = "some without commas", "another text", 123, "text"; 
$lines[2] = "some text with commas or no",, 123, "text"; 

y me gustaría tener una mesa:

$t[0] = array("text, with commas", "another text", "123", "text","5"); 
$t[1] = array("some without commas", "another text", "123", "text"); 
$t[2] = array("some text, with comma,s or no", NULL , "123", "text"); 

Si uso split($lines[0],",") I' ll obtener "text" ,"with commas" ... ¿Hay alguna manera elegante de hacerlo?

+1

Utilice 'explotar' en lugar de' dividir' –

+1

Utilice una herramienta creada para tal fin (p. 'fgetcsv' para nombrar uno) en lugar de' explotar' – salathe

Respuesta

15

Puede usar fgetcsv para analizar un archivo CSV sin tener que preocuparse de analizarlo usted mismo.

Ejemplo de PHP Manual:

$row = 1; 
if (($handle = fopen("test.csv", "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 
     echo "<p> $num fields in line $row: <br /></p>\n"; 
     $row++; 
     for ($c=0; $c < $num; $c++) { 
      echo $data[$c] . "<br />\n"; 
     } 
    } 
    fclose($handle); 
} 
+0

¿Hay una función similar para una línea? – liysd

+0

Sí, 'fgets' obtendrá una línea completa. –

+0

@liysd - Sí, puede pasar una cadena a [str_getcsv] (http://php.net/str_getcsv), sin embargo, esto solo está disponible en PHP 5.3+. La sección de comentarios tiene un reemplazo, sin embargo. – Matt

3

aquí es también es un método simple para leer el archivo csv.

 
$sfp = fopen('/path/to/source.csv','r'); 
$dfp = fopen('/path/to/destination.csv','w'); 
while ($row = fgetcsv($sfp,10000,",","")) { 
$goodstuff = ""; 
$goodstuff = str_replace("¦",",",$row[2]); 
$goodstuff .= "\n"; 
fwrite($dfp,$goodstuff); 
} 
fclose($sfp); 
fclose($dfp); 
1

WebIt4Me/reader proporciona una herramienta para leer o buscar a través de archivo CSV

1

Suponga que tiene una crear una función para el mismo, entonces que debe ser similar

function csvtoarray($filename='', $delimiter){ 

    if(!file_exists($filename) || !is_readable($filename)) return FALSE; 
    $header = NULL; 
    $data = array(); 

    if (($handle = fopen($filename, 'r')) !== FALSE) { 
     while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) 
     { 
      if(!$header){ 
       $header = $row; 
      }else{ 
       $data[] = array_combine($header, $row); 
      } 
     } 
     fclose($handle); 
    } 
    if(file_exists($filename)) @unlink($filename); 

    return $data; 
} 

$data = csvtoarray('file.csv', ','); 

print_r($data); 
+0

Ummm ... esto borra el archivo csv de origen, que tiene que ser el proceso incorrecto, como el 99% del tiempo. – ftrotter

0

Se podría utilizar algo como https://github.com/htmlburger/carbon-csv que permite asignación de columna:

$csv = new \Carbon_CSV\CsvFile('path-to-file/filename.csv'); 
$csv->set_column_names([ 
    0 => 'first_name', 
    1 => 'last_name', 
    2 => 'company_name', 
    3 => 'address', 
]); 
foreach ($csv as $row) { 
    print_r($row); 
} 

El resultado del código a continuación sería algo así como:

Array 
(
    [0] => Array 
     (
      [first_name] => John 
      [last_name] => Doe 
      [company_name] => Simple Company Name 
      [address] => Street Name, 1234, City Name, Country Name 
     ) 
    [1] => Array 
     (
      [first_name] => Jane 
      [last_name] => Doe 
      [company_name] => Nice Company Name 
      [address] => Street Name, 5678, City Name, Country Name 
     ) 
) 

Otra librería que hace lo mismo (y mucho más) es http://csv.thephpleague.com/9.0/reader/

Cuestiones relacionadas