Perl foi originalmente desenvolvido para o processamento de texto, como extrair as informações necessárias de um arquivo de texto especificado e para converter o arquivo de texto em uma forma diferente. Ler um arquivo de texto é uma tarefa muito comum em Perl. Por exemplo, você costuma ler arquivos CSV (Comma-Separated Value) para extrair dados e informações.

Um arquivo CSV pode ser criado com o uso de qualquer editor de texto, como notepad , notepad ++ , etc. Após adicionar o conteúdo a um arquivo de texto no bloco de notas, armazene-o como um arquivo csv com o uso da extensão .csv .
Exemplo de arquivo CSV:

Store the above file as new.csv

Um arquivo CSV pode ser usado para gerenciar arquivos de registro de bancos de dados de uma empresa ou empresa. Esses arquivos podem ser facilmente abertos no Excel e podem ser manipulados com o uso de qualquer software adequado. Perl também suporta a manipulação e criação desses arquivos 'csv' extraindo valores do arquivo, manipulando esses valores e restaurando-os no arquivo. Para extrair cada valor de uma linha específica, vamos usar a função de divisão .
 

Uso de Split()para extração de dados

split() é uma função predefinida em Perl que é usada para separar uma string em partes com a ajuda de um delimitador. Este delimitador pode ser qualquer caractere conforme a necessidade do usuário, mas geralmente consideramos a vírgula como delimitador.
split()leva dois parâmetros. O primeiro é um delimitador, o segundo é a string que precisa ser dividida.


Sintaxe:
split (_delimiter_, _string_);



Parâmetro:
_delimiter_: Valor do separador entre os elementos
_string_: De onde os valores devem ser extraídos

Retorna: um Array de elementos de string separados por _delimiter_

Exemplo:

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”.

Observação:

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

As etapas a seguir são seguidas para dividir as linhas de um arquivo CSV em partes usando um delimitador:

Etapa 1: Leia o arquivo linha por linha.
Etapa 2: para cada linha, armazene todos os valores em uma array.
Etapa 3: imprima todos os valores um por um para obter o resultado

Vamos ver um exemplo para entender melhor o assunto. A seguir está um código de split()função para separar as strings armazenadas no arquivo new.csv com o uso de um delimitador:

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";
}

Salve o código acima em um arquivo de texto com extensão .pl . Aqui, vamos salvá-lo como test.pl

Execute o arquivo salvo acima com o uso do seguinte comando:

perl test.pl new.csv

Saída:

Fugindo de uma vírgula

Às vezes, pode haver um arquivo com vírgula dentro dos campos de uma string que, se removido, mudará o significado dos dados ou tornará o registro inútil. Em tal situação, se uma split()função for usada, mesmo que entre aspas, ela separará os valores cada vez que receber uma vírgula como delimitador, porque a split()função não se preocupa com as aspas, nem entende nada sobre CSV. Ele apenas corta onde encontra o caractere separador.

A seguir está um arquivo CSV que tem uma vírgula entre as aspas:

No arquivo CSV acima, pode-se ver que o primeiro campo contém uma vírgula, portanto, está fechado entre aspas. Mas se executarmos a split()função neste arquivo, ela não ligará para essas aspas. A seguir está o resultado da aplicação de split()função em tal arquivo:

No arquivo acima, split()function dividiu o campo string em partes, mesmo que estivesse entre aspas, também porque estávamos imprimindo apenas três campos em nosso código, portanto, o terceiro campo de a última string é descartada no arquivo de saída.

Para lidar com tais situações, algumas restrições e escopos são adicionados ao Perl, essas restrições permitem que o compilador ignore a divisão de campos entre aspas.
Usamos o TEXT::CSV que permite leitor e gravador de CSV completo. TEXT::CSV é um módulo de MCPAN em Perl, que permite muitas novas funcionalidades, como leitura, análise e gravação de arquivos CSV. Esses módulos podem ser incluídos no programa Perl com o uso do seguinte pragma:

use Text::CSV

Mas primeiro, é necessário baixar e instalar este módulo no seu dispositivo para utilizar suas funcionalidades.
Instalação de TEXT::CSV:
Para Windows:

perl -MCPAN -e shell
install Text::CSV

Para um sistema baseado em Debian / Ubuntu:

$ sudo apt-get install libtext-csv-perl

Para um sistema baseado em RedHat / Centos / Fedora:

$ sudo yum install perl-Text-CSV

A seguir está um código a ser executado em nosso novo arquivo.csv para escapar do caractere de vírgula entre aspas:

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";
  }
}

Saída:

No exemplo acima, pode ser visto que o primeiro campo agora tem uma vírgula que foi escapada durante a análise do arquivo CSV.

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

separado por ", ".
A linha acima descreve a maneira de chamar o construtor da classe. Uma chamada de construtor é feita usando a seta -> .

$csv->parse($line)

Esta chamada tentará analisar a linha atual e dividi-la em partes. Retorne verdadeiro ou falso dependendo do sucesso ou falha.

Campos com novas linhas incorporadas

Em um arquivo CSV, também pode haver alguns campos com várias linhas ou com uma nova linha incorporada entre as palavras. Esses tipos de campos multilinhados quando passados ​​por uma split()função funcionam de maneira muito diferente em comparação com outros arquivos sem nova linha incorporada.
Exemplo:

Perl fornece um getline()método para lidar com esse tipo de arquivo.

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;

Saída:

No arquivo CSV acima, a nova linha incorporada agora é tratada com o uso do getline()método e Perl trata o novo campo como um, conforme exigido pelo programador e, portanto, foi colocado entre aspas.