from - php fgetcsv devolviendo todas las líneas
split csv php (6)
Tengo el siguiente archivo csv:
upc/ean/isbn,item name,category,supplier id,cost price,unit price,tax 1 name,tax 1 percent,tax 2 name,tax 2 percent,quantity,reorder level,description,allow alt. description,item has serial number
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
,Apple iMac,Computers,,10,12,8,8,10,10,10,1,Best computer,,
Cuando hago esto:
if (($handle = fopen($_FILES[''file_path''][''tmp_name''], "r")) !== FALSE)
{
$data = fgetcsv($handle);
var_dump($data);
}
Obtengo una matriz con 183 elementos, esperaría obtener solo una línea de la csv, pero obtengo todo el archivo.
Incluso probé $data = fgetcsv($handle, 1000);
y obtuve el mismo resultado
Es muy probable que sea un problema de final de línea. Intenta habilitar auto_detect_line_endings
que intentará determinar las terminaciones de línea del archivo.
ini_set(''auto_detect_line_endings'', true);
Si eso no resuelve el problema, entonces detecte el tipo de terminadores de línea usando el comando de file
:
$ file example.csv
example.csv: ASCII text, with CR line terminators
A continuación, puede convertir los finales de línea. No estoy seguro de qué sistema operativo está utilizando, pero hay muchas utilidades para la conversión de formato de archivo , por ejemplo, dos2unix
.
Esta es la solución más corta que pude pensar:
$fp = fopen(''test.csv'', ''r'');
// get the first (header) line
$header = fgetcsv($fp);
// get the rest of the rows
$data = array();
while ($row = fgetcsv($fp)) {
$arr = array();
foreach ($header as $i => $col)
$arr[$col] = $row[$i];
$data[] = $arr;
}
print_r($data);
Salida:
Array
(
[0] => Array
(
[upc/ean/isbn] =>
[item name] => Apple iMac
[category] => Computers
[supplier id] =>
[cost price] => 10
[unit price] => 12
[tax 1 name] => 8
[tax 1 percent] => 8
[tax 2 name] => 10
[tax 2 percent] => 10
[quantity] => 10
[reorder level] => 1
[description] => Best computer
[allow alt. description] =>
[item has serial number] =>
)
[1] => Array
(
[upc/ean/isbn] =>
[item name] => Apple iMac
[category] => Computers
[supplier id] =>
[cost price] => 10
[unit price] => 12
[tax 1 name] => 8
[tax 1 percent] => 8
[tax 2 name] => 10
[tax 2 percent] => 10
[quantity] => 10
[reorder level] => 1
[description] => Best computer
[allow alt. description] =>
[item has serial number] =>
)
// ...
[11] => Array
(
[upc/ean/isbn] =>
[item name] => Apple iMac
[category] => Computers
[supplier id] =>
[cost price] => 10
[unit price] => 12
[tax 1 name] => 8
[tax 1 percent] => 8
[tax 2 name] => 10
[tax 2 percent] => 10
[quantity] => 10
[reorder level] => 1
[description] => Best computer
[allow alt. description] =>
[item has serial number] =>
)
)
Para leer todo el archivo CSV a la vez, use:
$data = array_map("str_getcsv", file($fn));
var_dump($data);
Aunque tendrá que desplazarse a la matriz () la primera fila (si no usa las teclas de columna).
La solución para finales de línea inespecíficos:
$data = array_map("str_getcsv", preg_split(''/[/r/n]+/'', file_get_contents($fn)));
var_dump($data);
Si tiene la opción, retroceda y edite su archivo .csv para incluir terminaciones de línea de estilo "Unix" ... luego fgetcsv romperá automáticamente la matriz por terminaciones de línea
Tengo el mismo problema, en una Mac, con un archivo CSV generado por Microsoft Excel. Ejecuté el comando más en diferentes archivos, y parece que el final de línea difiere.
$ more excel.csv && more test.csv
[email protected]^[email protected]^[email protected]^M
[email protected]
[email protected]
[email protected]
solía
ini_set(''auto_detect_line_endings'', true);
antes de
fgetcsv($handle, 0, '';'')
y funciona. La respuesta aceptada es correcta.
tratar:
while (($data = fgetcsv($handle, 0, '','')) !== FALSE) {
$columns = count($data);
}
Alternativamente, puedes intentar usar str_getcsv(file_get_contents(...))