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| csvThis 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| csvNow 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 slowerresumo
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!