write from fputs csv_file array php fgetcsv

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



tratar:

while (($data = fgetcsv($handle, 0, '','')) !== FALSE) { $columns = count($data); }

Alternativamente, puedes intentar usar str_getcsv(file_get_contents(...))