2011-11-23 24 views
7

¿Cuál es la forma correcta de especificar el carácter de fin de línea de un archivo CSV con PHP? Tengo este script para escribir el archivo CSV.Carácter PHP de fin de línea para un archivo csv

<?php 

ini_set('display_errors', 1); 
error_reporting(E_ALL); 

include_once("phpshared.php"); 

function get_node_urls($nodeid) { 

$nodes = new SimpleXMLElement('linkcards.xml', null, true); 
$nodesarray = $nodes->xpath("//LINKCARD[@ID='$nodeid']"); 

$linkstring = ''; 
$node = $nodesarray[0]; 
$i = 0; 
foreach($node->LINKS->LINK as $url) 
{ 
     $linkstring .= $i.','.$url['ID'].','.$url->TITLE.','.$url->URL.'\r\n'; 
     $i++; 
} 
echo $linkstring; 

} 

echo get_node_urls(trim($_REQUEST['nodeid'])); 

?> 

Si se me carga $linkstring no hay retorno de carro al final de cada línea. Las líneas deben ser:

 
0, id1, http://link1.com 
1, id2, http://link2.com 

En su lugar, son:

 
0, id1, http://link1.com\r\n1, id2, http://link2.com 

El lector CSV lee esa línea como:

 
id1 http://link1.com\r\n1 

¿Hay una forma diferente de escribir el final de la línea de un CSV?

Respuesta

9

\r\n tiene que estar incluido en " en lugar de ' para que las secuencias de escape se interpretará (see documentation):

$linkstring .= $i.','.$url['ID'].','.$url->TITLE.','.$url->URL."\r\n"; 
+0

+1 Este es la respuesta correcta –

+0

¡Estupendo! Eso funciono. Gracias. – user823527

+0

+1 Arrggghhhh! Muchas gracias, el manejo del final de línea en PHP es absolutamente ridículo. – demongolem

3

Después de ver toda la web me encontré con que el problema se debe al Detección automática Final de línea no ser habilitado Solo configúralo en tu código y debería funcionar. Funcionó para mí

ini_set('auto_detect_line_endings',TRUE); 

Con la auto_detect le permite puede analizar el archivo como un archivo normal usando

$lines = file('your_csv_file.csv'); 

En mi caso ya estoy analizar las líneas CSV usando str_getcsc

function parse_my_csv($filename) { 
    $lines = file($filename); 
    $data = array(); 
    for($i=0;$i<count($lines);$i++) { 
     array_push($data, str_getcsv($lines[$i])); 
    } 
return $data; 
} 
Cuestiones relacionadas