separado - Cómo extraer datos del archivo csv en PHP
procesar csv (7)
Tengo un archivo csv que se parece a esto
$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],",")
obtendré "text" ,"with commas" ...
¿Hay alguna forma elegante de hacerlo?
Supongamos que tiene una función crear para las mismas cosas, entonces debería verse como
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);
aquí también hay 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);
Puede usar fgetcsv
para analizar un archivo CSV sin tener que preocuparse por 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);
}
WebIt4Me / reader proporciona una herramienta para leer o buscar a través de un archivo CSV
puedes leer los datos usando la siguiente función.
function readCSV() {
$csv = array_map(''str_getcsv'', file(''data.csv''));
array_shift($csv); //remove headers
}
http://www.pearlbells.co.uk/how-to-sort-a1a2-z9z10aa1aa2-az9az10-using-php/
Además de la sugerencia de Matt , también puedes usar SplFileObject
para leer en el archivo:
$file = new SplFileObject("data.csv");
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl('','', ''"'', ''//'); // this is the default anyway though
foreach ($file as $row) {
list ($fruit, $quantity) = $row;
// Do something with values
}
fuente: http://de.php.net/manual/en/splfileobject.setcsvcontrol.php
Puede usar algo como https://github.com/htmlburger/carbon-csv que permita el mapeo de columnas:
$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 siguiente código 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 biblioteca que hace lo mismo (y mucho más) es http://csv.thephpleague.com/9.0/reader/