2011-06-30 16 views
16

Obtengo datos CSV de una llamada SOAP en php. Lamentablemente, los datos pueden tener comas. Tiene el formato correcto como enTratar con comas en CSV

1, nombre, 2, lazo, 3, "primero, último", 5, NMEA, ...

tengo que analizarlo a valores individuales, ya sea en php o javascript . He navegado a través de subprocesos en el desbordamiento de la pila y en otros lugares, pero no he encontrado una solución específica en php/javascript.

El enfoque que actualmente estoy usando es

$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3'; 
$pattern = '/,|,"/'; 
$t2=preg_replace ('/,|(".*")/','$0*',$subject); 
$t2=str_replace(',','*',$t2); 
$t2=str_replace('*',',',$t2); 

Donde * es el deliminator, pero el preg_replace genera un extra *. He intentado un par de otros enfoques que implican preg_match y otras funciones preg_ pero no tuve éxito en tener ningún tipo de división limpia.

¿Alguna sugerencia sobre cómo dividir los datos CSV que contienen comas en ella?

Respuesta

30

No intente hacer esto con una expresión regular. Solo use str_getcsv()! El tercer parámetro informa str_getcsv() para buscar campos entrecomillados.

$subject = '123,name,456,lryyrt,123213,"first,last",8585,namea3'; 
$array = str_getcsv($subject, ",", '"'); 

print_r($array); 
// Prints: 
Array 
(
    [0] => 123 
    [1] => name 
    [2] => 456 
    [3] => lryyrt 
    [4] => 123213 
    [5] => first,last 
    [6] => 8585 
    [7] => namea3 
) 
+3

Para tener en cuenta, str_getcsv no está disponible hasta PHP 5.3. Antes de eso, se usó fgetcsv. Si no estaba obteniendo su contenido directamente de un archivo u otra secuencia, entonces podría tener que forzarlo en una secuencia (php: // memoria, escribir y restablecer la posición) o archivo primero. – Zimzat

2

Simplemente otra forma de convertir un archivo csv en una matriz asociativa.

<?php 
// 
// Convert csv file to associative array: 
// 

function csv_to_array($input, $delimiter=',') 
{ 
    $header = null; 
    $data = array(); 
    $csvData = str_getcsv($input, "\n"); 

    foreach($csvData as $csvLine){ 
     if(is_null($header)) $header = explode($delimiter, $csvLine); 
     else{ 

      $items = explode($delimiter, $csvLine); 

      for($n = 0, $m = count($header); $n < $m; $n++){ 
       $prepareData[$header[$n]] = $items[$n]; 
      } 

      $data[] = $prepareData; 
     } 
    } 

    return $data; 
} 

//----------------------------------- 
// 
//Usage: 

$csvArr = csv_to_array(file_get_contents('test.csv')); 

?> 
+0

@Phoenix - ¿Qué parte de esto se ocupa de las comas en los datos y las citas? ¿Me estoy perdiendo de algo? –

0

JavaScript para utilizar jQuery-CSV

Si ya está usando jQuery, basta con añadir el módulo de jQuery-csv.js para exponer los métodos de extensión. Luego simplemente convierta el CSV directamente a una matriz de JavaScript.

Si sólo está analizando el siguiente lo convertirá en una matriz unidimensional:

$.csv.toArray(csv); 

Si usted tiene una cadena CSV multilínea la siguiente lo convertirá en un período de dos matriz bidimensional:

$.csv.toArrays(csv); 

Nota: todos los diferentes finales de línea se detectan y se separaron correctamente utilizando una expresión regular inteligente.

El delimitador predeterminado es una comilla doble (") y el separador predeterminado es una coma (,) pero se puede cambiar la configuración de uso personalizados especificando en la llamada al método

Ex:.

$ .csv.toArray (csv, { separador: ';', delimitador: "'" });

que creó el proyecto para proporcionar una CSV analizador de extremo a extremo escrito en JavaScript eso toma las suposiciones rk de importar-exportar CSV.

Hacer el trabajo pesado en el cliente elimina la carga innecesaria en el servidor y elimina cualquier ida y vuelta innecesaria de AJAX al servidor.

Actualización:

Si usted está buscando una solución de servidor, la biblioteca también trabaja en Node.js.

+0

Gracias. Creo que elegiré algo así para un procesamiento csv del lado del cliente, pero mi aplicación se basó en el lado del servidor y tuve que consultar alguna base de datos no relacional que proporcionara salidas csv. –

+0

Lo siento. Creo que había olvidado la pregunta :-(. Después de todo, la publiqué hace casi un año y ese proyecto se ha cerrado. Gracias por señalar la alternativa de jQuery. Debo permanecer en mi mente, si lo necesito. de nuevo :-) –

+0

@LordLoh. Si necesita una solución del lado del servidor, simplemente confirmó que el complemento también funciona con Node.js. Los detalles sobre cómo importar en un script Node.js se pueden encontrar en la página del proyecto. –

Cuestiones relacionadas