New question

Question:

Date: 06-04-2018 17:56:27 (In Spanish)

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.
Tags: Array PHP - ASCII - CSV - Decoded - Development - Encoded - Error - Format - JSON - Opinion - PHP - PHP Advanced - PHP base64 - PHP JSON - PHP7 - Question - Script PHP - Start in Programming - Unicode - Web 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
 
frjcbbae garagebible.com