perl | Lectura de un archivo CSV

Perl se desarrolló originalmente para el procesamiento de texto, como extraer la información requerida de un archivo de texto específico y para convertir el archivo de texto en una forma diferente. Leer un archivo de texto es una tarea muy común en Perl. Por ejemplo, a menudo te encuentras leyendo archivos CSV (valores separados por comas) para extraer datos e información.

Se puede crear un archivo CSV con el uso de cualquier editor de texto, como el bloc de notas , el bloc de notas ++ , etc. Después de agregar contenido a un archivo de texto en el bloc de notas, guárdelo como un archivo csv con el uso de la extensión  .csv .

Ejemplo de un archivo CSV:  

Store the above file as new.csv

Un archivo CSV se puede utilizar para administrar archivos de registro de bases de datos de una empresa o empresa. Estos archivos se pueden abrir fácilmente en Excel y se pueden manipular con el uso de cualquier software adecuado. Perl también admite la manipulación y creación de estos archivos ‘csv’ al extraer valores del archivo, manipular estos valores y restaurarlos en el archivo. Para extraer cada valor de una línea específica, usaremos la función de división

Uso de Split() para la extracción de datos

split() es una función predefinida en Perl que se usa para separar una string en partes con la ayuda de un delimitador. Este delimitador puede ser cualquier carácter según los requisitos del usuario, pero generalmente tomamos una coma como delimitador. 
split() toma dos parámetros. El primero es un delimitador, el segundo es la string que debe dividirse.

Sintaxis: split(_delimiter_, _string_);
Parámetro:  
_delimiter_ : valor separador entre elementos 
_string_: de donde se extraerán los valores
Devuelve: una array de elementos de string separados por _delimiter_ 
 

Ejemplo:  

Input: $s = "Johny loves Sugar" 
Output: "Johny", "loves", "Sugar"
If Input string is passed to split function as,
@words = split("", $s);
The array @words will be filled with 3 values: “Johny”, “loves” and “Sugar”.

Nota: 

If $words[2] is printed then result will be "Sugar" as array indexing starts from 0.

Se siguen los siguientes pasos para dividir las líneas de un archivo CSV en partes usando un delimitador:
Paso 1: Lea el archivo línea por línea. 
Paso 2: para cada línea, almacene todos los valores en una array. 
Paso 3: Imprime todos los valores uno por uno para obtener el resultado

Vayamos a un ejemplo para entender mejor el tema. El siguiente es un código para la función split() para separar las strings almacenadas en el archivo new.csv con el uso de un delimitador: 

Perl

use strict;
   
my $file = $ARGV[0] or die;
open(my $data, '<', $file) or die;
   
while (my $line = <$data>) 
{
    chomp $line;
   
    # Split the line and store it
    # inside the words array
    my @words = split ", ", $line;  
   
    for (my $i = 0; $i <= 2; $i++)
    {
        print "$words[$i] ";
    }
    print "\n";
}

Guarde el código anterior en un archivo de texto con una extensión .pl . Aquí, vamos a guardarlo como test.pl

Ejecute el archivo guardado anteriormente con el uso del siguiente comando: 

perl test.pl new.csv

Producción:  

Escapar de un carácter de coma

A veces puede haber un archivo que tenga una coma dentro de los campos de una string que, si se elimina, cambiará el significado de los datos o hará que el registro sea inútil. En tal situación, si se usa una función split() , incluso si está entre comillas, separará los valores cada vez que obtenga una coma como delimitador, porque la función split() no se preocupa por las comillas, ni entiende cualquier cosa sobre CSV. Simplemente corta donde encuentra el carácter separador.

El siguiente es un archivo CSV que tiene una coma entre comillas:  

En el archivo CSV anterior, se puede ver que el primer campo tiene una coma dentro de sí mismo, por lo tanto, está cerrado entre comillas. Pero si ejecutamos la función dividir() en este archivo, no le importarán esas comillas. El siguiente es el resultado de aplicar la función split() en dicho archivo: 

En el archivo anterior, la función split() dividió el campo de string en partes incluso si estaba entre comillas, también porque estábamos imprimiendo solo tres campos en nuestro código, por lo tanto, el tercer campo de la última string se coloca en el archivo de salida .

Para manejar tales situaciones, se agregan algunas restricciones y alcances a Perl, estas restricciones permiten que el compilador omita la división de campos entre comillas. 
Usamos el TEXT::CSV que permite el lector y escritor CSV completo. TEXT::CSV es un módulo de MCPAN en Perl, que permite muchas funciones nuevas, como leer, analizar y escribir archivos CSV. Estos módulos se pueden incluir en el programa Perl con el uso del siguiente pragma: 

use Text::CSV

Pero primero, es necesario descargar e instalar este módulo en su dispositivo para usar sus funcionalidades. 

Instalación de TEXTO::CSV:  
Para Windows: 

perl -MCPAN -e shell
install Text::CSV

Para un sistema basado en Debian/Ubuntu:  

$ sudo apt-get install libtext-csv-perl

Para un sistema basado en RedHat/Centos/Fedora: 

$ sudo yum install perl-Text-CSV

El siguiente es un código que se ejecutará en nuestro archivo new.csv para escapar del carácter de coma entre comillas:  

Perl

use strict;
   
# Using Text::CSV file to allow
# full CSV Reader and Writer
use Text::CSV;
   
my $csv = Text::CSV->new({ sep_char => ', ' });
    
my $file_to_be_read = $ARGV[0] or die;
   
# Reading the file
open(my $data_file, '<', $file_to_be_read) or die;
while (my $line = <$data_file>) 
{
  chomp $line;
    
  # Parsing the line
  if ($csv->parse($line)) 
  {
         
      # Extracting elements
      my @words = $csv->fields();
      for (my $i = 0; $i <= 2; $i++) 
      {
          print "$words[$i] ";
      }
   
      print "\n";
  } 
  else
  {
      # Warning to be displayed
      warn "Line could not be parsed: $line\n";
  }
}

Producción:

En el ejemplo anterior, se puede ver que el primer campo ahora tiene una coma que se ha escapado al analizar el archivo CSV. 

my $csv = Text::CSV->new({ sep_char => ', ' }); 

separado por «, «. 
La línea anterior describe la forma de llamar al constructor en la clase. Una llamada de constructor se realiza usando la flecha -> .

$csv->parse($line)

Esta llamada intentará analizar la línea actual y la dividirá en partes. Devuelve verdadero o falso según el éxito o el fracaso.
 

Campos con líneas nuevas incrustadas

En un archivo CSV, también puede haber algunos campos con varias líneas o con una nueva línea incrustada entre las palabras. Estos tipos de campos de líneas múltiples cuando se pasan a través de una función split() funcionan de manera muy diferente en comparación con otros archivos sin una nueva línea incrustada. 
Ejemplo: 
 

Perl proporciona un método getline() para manejar este tipo de archivos. 

Perl

use strict;
   
# Using Text::CSV file to allow
# full CSV Reader and Writer
use Text::CSV;
   
my $file = $ARGV[0] or die;
   
my $csv = Text::CSV->new (
{
    binary => 1,
    auto_diag => 1,
    sep_char => ', '
});
   
my $sum = 0;
   
# Reading the file
open(my $data, '<:encoding(utf8)', $file) or die;
   
while (my $words = $csv->getline($data)) 
{
    for (my $i = 0; $i < 3; $i++) 
    {
        print "$words->[$i]";
    }
    print "\n";
}
   
# Checking for End-of-file
if (not $csv->eof) 
{
    $csv->error_diag();
}
close $data;

Producción: 

En el archivo CSV anterior, la nueva línea incrustada ahora se maneja con el uso del método getline() y Perl trata el nuevo campo como uno solo, según lo requiera el programador, y por lo tanto se puso entre comillas.
 

Publicación traducida automáticamente

Artículo escrito por XDoodler y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *