Question:
Date: 06-04-2018 17:56:27
(In Spanish)
1. Mostrare la función primero:
2. Colocare aqui el contenido de mi archivo "file.csv":
code,name,type,years,versions,rivals,Cost,started,Till
ookh6547,JAVA,language,20,19874654,C#,0,09/12/1990,present
25aookh6547,C#,language,30,963542432,JAVA,0,10/10/1989,present
9ddc3552,PHP,language,25,4543664,python,0,13/5/1994,present
3. Este es el resultado cuando imprimo el array:
Cuando intento hacer esto por ejemplo:
me muestra este error:
Por ejemplo, tambien hice otra función(llamemosle fun2) e introduci como parametro este array generado por la función convertions(), y además le pase como segundo parametro una variable con el nombre de una de las cabeceras, ejemplo $cabecera = "type"; fun2(array1, $cabecera); e hice que la función buscara dentro del array a ver si una de las keys tenia el mismo nombre, y debia retornarme "SI" o "NO", dependiendo de lo que encontrar. Pues siempre me arroja que "NO", y esta mal porque dentro del arreglo si esta esa key (type).
Lo que deberia quedarme es algo como esto:
Sucede que después de imprimir el array resultante, coloque esto:
y me imprimio algo como esto:
por lo que pude leer por ahi, se tratan de unicode characters.
Mi pregunta es:
Existe alguna forma de solucionar este problema? Existe en PHP alguna forma de "formatear" el archivo csv, o en su defecto, formatear los datos que se extraigan de ese archivo, quitar esos caracteres antes de hacer la conversión a array? Para que me quede bien el array resultante. Ese problema me ha tenido trabado todo el dia.
Espero puedan brindarme alguna sugerencia o ejemplos que me sirvan para solucionar ese problema.
Votes: 0 - Answers: 6 - Views: 12 Share on: Google Facebook Twitter LinkedIn Link
Problemas para convertir archivos a array[Unresolved]
Estoy tengo problemas cuando convierto un archivo csv a array. Veran, he creado una función que me hace esa conversion y me returna el array. El proceso lo hace relativamente "bien" y me genera el array pero fijense como es el array resultante:1. Mostrare la función primero:
function convertions($file, $delimt, $encl, $a) { if(!file_exists($file)){ return false; } $file_lines = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if($file_lines === array()){ return NULL; } if($a === true) { $file_row = array_shift($file_lines); $headers = array_map('trim', str_getcsv($file_row, $delimt, $encl)); } $array_result = NULL; foreach ($file_lines as $row) { if(trim($row) === '') continue; $fields_arr = array_map('trim', str_getcsv($row, $delimt, $encl)); if($a === true) { $array_result[] = array_combine ($headers, $fields_arr); } else { $array_result[] = $fields_arr; } } return $array_result; } $new_array = array(); $new_array = convertions('file.csv',',','"',true); print_r($new_array);
2. Colocare aqui el contenido de mi archivo "file.csv":
code,name,type,years,versions,rivals,Cost,started,Till
ookh6547,JAVA,language,20,19874654,C#,0,09/12/1990,present
25aookh6547,C#,language,30,963542432,JAVA,0,10/10/1989,present
9ddc3552,PHP,language,25,4543664,python,0,13/5/1994,present
3. Este es el resultado cuando imprimo el array:
Array ( [0] => Array ( [??code] => ookh6547 [name] => JAVA [type] => language [years] => 20 [versions] => 19874654 [rivals] => C# [Cost] => 0 [started] => 09/12/1990 [till] => present ) [1] => Array ( [??code] => 25aookh6547 [name] => c# [type] => language [years] => 30 [versions] => 963542432 [rivals] => JAVA [Cost] => 0 [started] => 10/10/1989 [Till] => present ) [2] => Array ( [??code] => 9ddc3552 [name] => PHP [type] => language [years] => 25 [versions] => 4543664 [rivals] => python [Cost] => 0 [started] => 13/5/1994 [Till] => present ) )
Cuando intento hacer esto por ejemplo:
echo $new_array[0]['type'];
me muestra este error:
Notice: Undefined index: type in C:\xampp\htdocs\ArraysMult\proof.php on line 88
Por ejemplo, tambien hice otra función(llamemosle fun2) e introduci como parametro este array generado por la función convertions(), y además le pase como segundo parametro una variable con el nombre de una de las cabeceras, ejemplo $cabecera = "type"; fun2(array1, $cabecera); e hice que la función buscara dentro del array a ver si una de las keys tenia el mismo nombre, y debia retornarme "SI" o "NO", dependiendo de lo que encontrar. Pues siempre me arroja que "NO", y esta mal porque dentro del arreglo si esta esa key (type).
Lo que deberia quedarme es algo como esto:
Array ( [0] => Array ( [code] => ookh6547 [name] => JAVA [type] => language [years] => 20 [versions] => 19874654 [rivals] => C# [Cost] => 0 [started] => 09/12/1990 [Till] => present ) [1] => Array ( [code] => 25aookh6547 [name] => C# [type] => language [years] => 30 [versions] => 963542432 [rivals] => JAVA [Cost] => 0 [started] => 10/10/1989 [Till] => present ) [2] => Array ( [code] => 9ddc3552 [name] => PHP [type] => language [years] => 25 [versions] => 4543664 [rivals] => python [Cost] => 0 [started] => 13/5/1994 [Till] => present ) )
Sucede que después de imprimir el array resultante, coloque esto:
echo json_encode ($ new_array);
y me imprimio algo como esto:
[{"c\u0000o\u0000d\u0000e":"o\u0000o\u0000k\u00006\u00005\u00004\u00007","n\u0000a\u0000m\u0000e":"J\u0000A\u0000V\u0000A", "t\u0000y\u0000p\u0000e":"l\u0000a\u0000n\u0000g\u0000u\u0000a\u0000g\u0000e", ...(y asi en todo el array)
por lo que pude leer por ahi, se tratan de unicode characters.
Mi pregunta es:
Existe alguna forma de solucionar este problema? Existe en PHP alguna forma de "formatear" el archivo csv, o en su defecto, formatear los datos que se extraigan de ese archivo, quitar esos caracteres antes de hacer la conversión a array? Para que me quede bien el array resultante. Ese problema me ha tenido trabado todo el dia.
Espero puedan brindarme alguna sugerencia o ejemplos que me sirvan para solucionar ese problema.
Votes: 0 - Answers: 6 - Views: 12 Share on: Google Facebook Twitter LinkedIn Link
Answers:
-
Date: 07-04-2018 12:20:30 Hola
Si entiendo bien lo que quieres hacer, es leer un archivo csv y convertirlo en un array.
Existe una función nativa de PHP es str_getcsv — Convierte un string con formato CSV a un array.
Ahora valiendonos de ella.
Suponiendo que el archivo CSV se llame data.csv con el contenido que mencionas
code,name,type,years,versions,rivals,Cost,started,Till ookh6547,JAVA,language,20,19874654,C#,0,09/12/1990,present 25aookh6547,C#,language,30,963542432,JAVA,0,10/10/1989,present 9ddc3552,PHP,language,25,4543664,python,0,13/5/1994,present
Con el siguiente codigo se crea un array a partir de dicho archivo data.csv
<?php $csv = array_map('str_getcsv', file('data.csv')); ?>
SI hacemos un var_dump($csv)
<?php $csv = array_map('str_getcsv', file('data.csv')); var_dump($csv); ?>
Obtenemos el Array de la siguiente forma:
array (size=4) 0 => array (size=9) 0 => string 'code' (length=4) 1 => string 'name' (length=4) 2 => string 'type' (length=4) 3 => string 'years' (length=5) 4 => string 'versions' (length=8) 5 => string 'rivals' (length=6) 6 => string 'Cost' (length=4) 7 => string 'started' (length=7) 8 => string 'Till' (length=4) 1 => array (size=9) 0 => string 'ookh6547' (length=8) 1 => string 'JAVA' (length=4) 2 => string 'language' (length=8) 3 => string '20' (length=2) 4 => string '19874654' (length=8) 5 => string 'C#' (length=2) 6 => string '0' (length=1) 7 => string '09/12/1990' (length=10) 8 => string 'present' (length=7) 2 => array (size=9) 0 => string '25aookh6547' (length=11) 1 => string 'C#' (length=2) 2 => string 'language' (length=8) 3 => string '30' (length=2) 4 => string '963542432' (length=9) 5 => string 'JAVA' (length=4) 6 => string '0' (length=1) 7 => string '10/10/1989' (length=10) 8 => string 'present' (length=7) 3 => array (size=9) 0 => string '9ddc3552' (length=8) 1 => string 'PHP' (length=3) 2 => string 'language' (length=8) 3 => string '25' (length=2) 4 => string '4543664' (length=7) 5 => string 'python' (length=6) 6 => string '0' (length=1) 7 => string '13/5/1994' (length=9) 8 => string 'present' (length=7)
Del Index la posición 0 sería el encabezado, los titulos.
Para imprimir el primer título echo $csv[0][0]; // muestra: code
A partir de la posición 1 en adelante serían los datos, items.
Para imprimir el primer item seria echo $csv[1][0]; // muestra: ookh6547
Si quiero mostrar cada item de la primera colección de datos sería algo como:
<?php $csv = array_map('str_getcsv', file('data.csv')); for($i=0; $i<count($csv); $i++) { //saco el valor de cada elemento echo $csv[1][$i]; echo "<br>"; } ?>
Resultado:
ookh6547 JAVA language 20
Con el título incluido:
for($i=0; $i<count($csv); $i++) { //saco el valor de cada elemento echo $csv[0][$i].': '.$csv[1][$i]; echo "<br>"; }
Listado:
<?php $csv = array_map('str_getcsv', file('data.csv')); $cantidadItems = count($csv); $cantidadTitulos = count($csv[0]); echo 'Cantidad de Items: '.($cantidadItems-1)."<br>Cantidad de Titulos: $cantidadTitulos<hr>"; for($item=1; $item<$cantidadItems; $item++) { for($i=0; $i<$cantidadTitulos; $i++) { //saco el valor de cada elemento echo "<strong>".$csv[0][$i].':</strong> '.$csv[$item][$i]; echo "<br>"; } echo "<hr>"; } ?>
Muestra algo como:
Seguramente habrá alguna otra manera de hacerlo más eficiente, esta es la que se me ocurre en este momento.
Espero que te sirva de ayuda.
Saludos Votes: 0 - Link answer -
Date: 07-04-2018 13:53:42 Hola, espero este teniendo un buen día. Gracias por dedicarse el tiempo de pasar por aqui y aportar sus valiosos conocimientos.
Bueno vera, he aplicado su codigo y probé con otro archivo bajado de la misma fuente, este archivo se llama "fish.csv". Si me genera un array pero suceden dos cosas:
1. El array que me genera es este:
Array ( [0] => Array ( [0] => [??name] [1] => [age] [2] => [earnings] [3] => [date] ) [1] => Array ( [0] => mark [1] => 27 [2] => 2800 [3] => 1/4/2018 5:22:20 AM ) [2] => Array ( [0] => patrick [1] => 30 [2] => 3000 [3] => 2/4/2018 18:22:20 PM ) [3] => Array ( [0] => karls [1] => 25 [2] => 800 [3] => 30/3/2018 9:22:20 AM ) )
me sigue apareciendo esos extraños simbolor.
El problema es que los nombres de los títulos no me los reconoce. Votes: 0 - Link answer -
Date: 07-04-2018 13:59:56 Te dejo otro codigo, que me parece que es lo que buscabas. Array asociativo.
Utilizando POO extendiendo a la funcionalidad de SplFileObject
<?php class CSVFile extends SplFileObject { private $keys; public function __construct($file) { parent::__construct($file); $this->setFlags(SplFileObject::READ_CSV); } public function rewind() { parent::rewind(); $this->keys = parent::current(); parent::next(); } public function current() { return array_combine($this->keys, parent::current()); } public function getKeys() { return $this->keys; } } // $file = 'data.csv'; $csv = new CSVFile($file); $item[]=$line; // cada linea en un array. iteme es un array de datos foreach ($csv as $line) { $item[]=$line; } var_dump($item); // Muestro los datos del primer elemento del array echo 'Datos del primer array [0] <hr>'; echo $item[0]['code'].'<br>'; echo $item[0]['name'].'<br>'; echo $item[0]['type'].'<br>'; echo $item[0]['years'].'<br>'; echo $item[0]['versions'].'<br>'; echo $item[0]['rivals'].'<br>'; echo $item[0]['Cost'].'<br>'; echo $item[0]['started'].'<br>'; echo $item[0]['Till'].'<br>';
Resultado:
Fuente
Solo te queda experimentar con el codigo y adaptarlo a tus necesidades.
Saludos. Votes: 0 - Link answer -
Date: 07-04-2018 15:12:21 Gracias por ese codigo, esta bastante interesante, me gustó. Sin embargo, el resultado obtenido sigue siendo este array:
Array ( [0] => Array ( [0] => [??name] [1] => [age] [2] => [earnings] [3] => [date] ) [1] => Array ( [0] => mark [1] => 27 [2] => 2800 [3] => 1/4/2018 5:22:20 AM ) [2] => Array ( [0] => patrick [1] => 30 [2] => 3000 [3] => 2/4/2018 18:22:20 PM ) [3] => Array ( [0] => karls [1] => 25 [2] => 800 [3] => 30/3/2018 9:22:20 AM ) ) //impreso con print_r(), con var_dump() igual el mismo resultado...
sigue teniendo problema en los titulos Votes: 0 - Link answer -
Date: 07-04-2018 16:20:47 que contenido tiene el archivo csv?
una key del array con este nombre [??name] no es valido por eso falla.
Posiblemente el formato del archivo tenga algo mal, no se.
Ahora si al archivo lo abres con el block de notas y lo vuelves a grabar con el mismo nombre. Te da error? Votes: 0 - Link answer -
Date: 08-04-2018 13:55:16 Seguro que hay algo extraño en el archivo, como caracteres no imprimibles que no se ven a simple vista, alguna codificación en el archivo.
En este caso lamento no poder ayudarte ya que desconozco su naturaleza.
Por allí alguien más eche luz sobre el tema.
Saludos Votes: 0 - Link answer
To actively participate in the community first must authenticate, enter the system.Sign In