como ler & processar os ficheiros CSV com Ruby

CSV significa “valores separados por vírgulas”.

é um formato de dados comum que consiste em linhas com valores separados por vírgulas. É usado para exportar & importar dados.

por exemplo:

pode exportar os seus contactos do Gmail como um ficheiro CSV, e também pode importá-los com o mesmo formato.

este é o aspecto de um ficheiro CSV:

id,name1,chocolate2,bacon3,apple4,banana5,almonds

Agora você vai aprender como usar a biblioteca Ruby CSV para ler & escrever arquivos CSV.

Ruby CSV Analising

Ruby comes with a built-in CSV library.

pode ler directamente um ficheiro:

require 'csv'CSV.read("favorite_foods.csv")

ou você pode processar uma string com dados CSV:

require 'csv'CSV.parse("1,chocolate\n2,bacon\n3,apple")

o resultado?

você tem um array bidimensional onde cada entrada é uma linha na tabela.

parece-se com isto:

, , , , , ]

você pode usar índices de array como data para trabalhar com esses dados.Mas há uma maneira melhor!

opções CSV

se o seu ficheiro tiver cabeçalhos, poderá dizer ao analisador CSV para os usar.

table = CSV.parse(File.read("cats.csv"), headers: true)

agora em vez de um array multidimensional você tem um objeto de tabela CSV.

aqui está a descrição:

“a CSV::Table é uma estrutura bidimensional de dados para representar documentos CSV. As tabelas permitem que você trabalhe com os dados por linha ou coluna, manipular os dados, e até mesmo converter os resultados de volta para CSV.”

dada uma destas tabelas, você pode obter os dados que você precisa de qualquer linha.

Exemplo:

table# "1"table# "chocolate"

Aqui 0 é a primeira linha, id & name são os nomes de coluna.

existem dois modos de tabela:

  • by_col
  • by_row

ao alterar o modo da tabela (row por omissão), poderá olhar para os dados de diferentes ângulos.

Por exemplo:

table.by_col# table.by_col# 

Aqui 0 é a primeira coluna, 1 é a segunda coluna.

estes dois métodos devolvem uma cópia da tabela.

se você quiser fazer alterações na tabela original, então você pode usar os métodos by_col! & by_row!.

isto vai ser mais eficiente em memória porque nenhuma cópia da tabela é criada.

como usar conversores CSV

você deve ter notado que temos a nossa coluna id como um conjunto de cadeias.E se precisarmos de inteiros?

você pode obtê-los chamando to_i em cada corda…

mas há um atalho!

a biblioteca Ruby CSV implementa algo chamado conversores.

um conversor irá transformar automaticamente os valores para si.

por exemplo:

CSV.parse("1,2,3,4,5")# ]CSV.parse("1,2,3,4,5", converters: :numeric)# ]

existem 6 conversores incorporados:

  • Integer
  • Float
  • Numeric (Float + Integer)
  • Data
  • DateTime
  • Todos

Mas você também pode criar seus próprios conversores personalizados.

veja como:

CSV::Converters = ->(value) { value.to_sym rescue value }

Você pode usar o conversor de novo como este:

CSV.parse("a,b,c", headers: false, converters: :symbol)# ]

Como Criar um Novo Arquivo CSV

No topo de ser capaz de analisar & leia arquivos CSV de formas diferentes, você também pode criar um arquivo CSV a partir do zero.

esta é a maneira mais fácil:

cats = , , ]cats.map { |c| c.join(",") }.join("\n")

Você também pode usar o método generate :

CSV.generate do |csv| csv 

This prepares the data to be in the right format.

If you want to write to a file you'll have to use something like , or instead of you can use with a file name & write mode enabled.

CSV.open("cats.csv", "w") do |csv| csv 

Now you have a new CSV file!

CSV Gems & Performance

The built-in library is fine & it will get the job done.

But you can also find a few CSV parsing gems with different features.

For example, the gem will convert your CSV data into an array of hashes.

Example:

require 'smarter_csv'IntegerConverter = Object.newdef IntegerConverter.convert(value) Integer(value)endSmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter })# 

aqui está uma comparação de desempenho:

Comparison: CSV: 112.9 i/sSmarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower

resumo

aprendeu a ler & escrever ficheiros CSV em Ruby! Você também aprendeu sobre conversores & jóias Ruby alternativas para processar seus dados CSV.

se quiser processar grandes ficheiros CSV (> 10MB), poderá querer usar o método CSV.foreach(file_name) com um bloco. Isto irá ler uma linha de cada vez & usar muito menos memória.Por favor, compartilhe este artigo para que mais pessoas possam encontrá-lo!

Deixe uma resposta

O seu endereço de email não será publicado.