2011-05-03 4 views
5

Parece que el delimitador del archivo csv editado y guardado por OpenOffice Excel es ";" mientras que Microsoft Office Excel es "," ¿cómo debería escribir un programa para analizar el archivo csv sin importar qué delimitador use?¿cómo debo analizar el archivo csv en php cuando varía el delimitador?

+1

Creo que Microsoft se opondría a la dilución de marca registrada involucrada en el uso de 'Excel' para describir la hoja de cálculo de Openoffice. – pavium

Respuesta

0

fgetcsv() le permite especificar el delimitador como el tercer argumento.

En cuanto a la detección automática, hay algunas respuestas interesantes para this question.

1

Utilice el método SplFileObject :: getCsvControl. uso Ejemplo:

<?php 
$csvFileObject = new SplFileObject($_FILES["csv"]["tmp_name"]); 
list($delimiter, $enclosure) = $csvFileObject->getCsvControl(); 

$lines = fopen($_FILES["csv"]["tmp_name"], 'r'); 
if($lines) { 
    while (($line = fgetcsv($lines, 4096, $delimiter, $enclosure)) !== false) { 
     //do something 
    } 
}  

Referencia: http://php.net/manual/en/splfileobject.getcsvcontrol.php

+1

Este método no funciona correctamente en 5.5 (también en versiones anteriores). –

2

estoy usando esta función en una de mis aplicaciones para determinar qué separador se utiliza:

function get_separator($csvstring, $fallback = ';') { 
    $seps = array(';',',','|',"\t"); 
    $max = 0; 
    $separator = false; 
    foreach($seps as $sep){ 
     $count = substr_count($csvstring, $sep); 
     if($count > $max){ 
      $separator = $sep; 
      $max = $count; 
     } 
    } 

    if($separator) return $separator; 
    return $fallback; 
} 

Básicamente comprueba que el separador se produce en más y lo devuelve. Funciona sin problemas desde hace unos dos años

Cuestiones relacionadas