Tenho um arquivo CSV chamado "A.csv". Preciso gerar um novo arquivo CSV chamado "B.csv" com dados de "A.csv".
Usarei um subconjunto de colunas de "A.csv" e terei que atualizar os valores de uma coluna para novos valores em "B.csv". Por fim, usarei esses dados de B.csv para validar em um banco de dados.
- Como faço para criar um novo arquivo CSV?
- Como copio os dados das colunas obrigatórias de A.csv para "B.csv"?
- Como faço para anexar valores para uma coluna específica?
Sou novo em Ruby, mas consigo ler CSV para obter um array ou hash.
Respostas:
Como mikeb apontou, existem os documentos - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Ou você pode acompanhar os exemplos abaixo (todos são testados e trabalhando):
Para criar um novo arquivo:
Neste arquivo, teremos duas linhas, uma linha de cabeçalho e uma linha de dados, CSV muito simples:
require "csv" CSV.open("file.csv", "wb") do |csv| csv << ["animal", "count", "price"] csv << ["fox", "1", "$90.00"] end
resultado, um arquivo denominado "file.csv" com o seguinte:
animal,count,price fox,1,$90.00
Como anexar dados a um CSV
Quase a mesma fórmula acima, em vez de usar o modo "wb", usaremos o modo "a +". Para obter mais informações sobre isso, consulte esta resposta para estouro de pilha: Quais são os modos e opções do Ruby File.open?
CSV.open("file.csv", "a+") do |csv| csv << ["cow", "3","2500"] end
Agora, quando abrimos nosso arquivo.csv, temos:
animal,count,price fox,1,$90.00 cow,3,2500
Leia nosso arquivo CSV
Agora você sabe como copiar e gravar em um arquivo, ler um CSV e, portanto, obter os dados para manipulação que você acabou de fazer:
CSV.foreach("file.csv") do |row| puts row #first row would be ["animal", "count", "price"] - etc. end
Claro, isso é como uma das centenas de maneiras diferentes de obter informações de um CSV usando esta joia. Para obter mais informações, sugiro visitar os documentos agora que você tem uma cartilha: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
fonte
Você já viu a classe CSV do Ruby? Parece muito abrangente. Confira aqui: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html
fonte
Você provavelmente vai querer usar
CSV::parse
para ajudar Ruby a entender seu CSV como a tabela de dados que ele é e permitir acesso fácil aos valores por cabeçalho.Infelizmente, a documentação
CSV::parse
disponível sobre o método não deixa muito claro como realmente usá-lo para esse propósito.Eu tive uma tarefa semelhante e fui ajudado muito mais por Como ler e analisar arquivos CSV com Ruby em rubyguides.com do que pela documentação da classe CSV ou pelas respostas apontando para ela daqui.
Recomendo a leitura dessa página na íntegra. A parte crucial é transformar um determinado CSV em um
CSV::Table
objeto usando:table = CSV.parse(File.read("cats.csv"), headers: true)
Agora há documentação sobre a
CSV::Table
classe , mas novamente você pode ser ajudado mais pelos exemplos claros na página rubyguides.com. Algo que destacarei é que, quando você disser.parse
para esperar cabeçalhos, a tabela resultante tratará a primeira linha de dados como uma linha[0]
.Você provavelmente estará especialmente interessado no
.by_col
método disponível para seu novoTable
objeto. Isso permitirá que você itere através de diferentes posições de índice de coluna na entrada e / ou saída e copie de uma para a outra ou adicione um novo valor à saída. Se eu conseguir fazer funcionar, voltarei e postarei um exemplo.fonte