Jak utworzyć kopię niektórych kolumn pliku CSV w języku Ruby z różnymi danymi w jednej kolumnie?

84

Mam plik CSV o nazwie „A.csv”. Muszę wygenerować nowy plik CSV o nazwie „B.csv” z danymi z „A.csv”.

Będę używał podzbioru kolumn z „A.csv” i będę musiał zaktualizować wartości jednej kolumny do nowych wartości w „B.csv”. Ostatecznie wykorzystam te dane z B.csv do sprawdzenia poprawności w bazie danych.

  1. Jak utworzyć nowy plik CSV?
  2. Jak skopiować dane wymaganych kolumn z pliku A.csv do „B.csv”?
  3. Jak dołączyć wartości dla określonej kolumny?

Jestem nowy w Rubim, ale mogę odczytać CSV, aby uzyskać tablicę lub skrót.

user1718712
źródło
2
Brakuje podstawowych informacji, takich jak pokazanie nam Twojego wysiłku w rozwiązaniu problemu. Te informacje znajdują się w dokumentacji CSV. Przeczytaj „ Jak zadawać pytania ” i „ minimalny powtarzalny przykład ”.
Tin Man
Możliwy duplikat macierzy wyjściowej do CSV w Rubim
phunehehe

Odpowiedzi:

191

Jak zauważył mikeb, istnieją dokumenty - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - Lub możesz śledzić poniższe przykłady (wszystkie są przetestowane i pracujący):

Aby utworzyć nowy plik:

W tym pliku będziemy mieć dwa wiersze, wiersz nagłówka i wiersz danych, bardzo prosty plik CSV:

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

w wyniku otrzymamy plik o nazwie „file.csv” z następującymi elementami:

animal,count,price
fox,1,$90.00

Jak dołączyć dane do pliku CSV

Prawie taka sama formuła jak powyżej, ale zamiast używać trybu „wb”, użyjemy trybu „a +”. Aby uzyskać więcej informacji na ten temat, zobacz odpowiedź przepełnienia stosu: Jakie są tryby i opcje Ruby File.open?

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

Teraz, kiedy otwieramy nasz plik.csv, mamy:

animal,count,price
fox,1,$90.00
cow,3,2500

Przeczytaj z naszego pliku CSV

Teraz wiesz, jak kopiować i zapisywać w pliku, czytać plik CSV, a tym samym pobierać dane do manipulacji, które po prostu robisz:

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

Oczywiście jest to jeden ze stu różnych sposobów pobierania informacji z pliku CSV za pomocą tego klejnotu. Aby uzyskać więcej informacji, proponuję odwiedzić dokumentację teraz, gdy masz już elementarz: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

newUserNameHere
źródło
A jeśli chcę od razu otworzyć bez pisania? Po prostu nie używaj bloku?
Donato
dzięki za kopiowanie i wklejanie kodu! - zbyt leniwy, żeby to napisać.
DominikAngerer
Obejmuje to tworzenie nowego pliku CSV, ale następnie przechodzi do informacji o dodawaniu i odczytywaniu całych wierszy, zamiast zajmować się żądaniem skopiowania podzbioru dostępnych kumn i zmiany lub dodania do ich wartości. Mam taki sam projekt jak PO i nie pomogła mi dokumentacja ani ta odpowiedź, więc mam nadzieję, że wrócę tutaj, aby udzielić bardziej szczegółowej odpowiedzi, gdy to zrozumiem.
Tyler James Young
4

Widziałeś klasę CSV Rubiego? Wydaje się dość wyczerpujące. Sprawdź to tutaj: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

MikeB
źródło
1
dzięki za link. Mógłbym to odnieść. Czy mogę edytować plik CSV przez Ruby? Chodzi mi o to, czy mogę zaktualizować wartości kolumn w csv? później uzyskać hash tylko wymaganych kolumn?
user1718712
0

Prawdopodobnie będziesz chciał użyć, CSV::parseaby pomóc Ruby zrozumieć swój plik CSV jako tabelę danych, którymi jest i umożliwić łatwy dostęp do wartości według nagłówka.

Niestety, z dostępnej dokumentacji tej CSV::parsemetody nie wynika jasno, jak właściwie jej używać do tego celu.

Miałem podobne zadanie i znacznie bardziej pomogło mi How to Read & Parse CSV Files With Ruby na rubyguides.com niż dokumentacja CSV lub odpowiedzi wskazujące na to stąd.

Zalecam przeczytanie tej strony w całości. Najważniejsze jest przekształcenie danego pliku CSV w CSV::Tableobiekt przy użyciu:

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

Teraz jest dokumentacja na temat CSV::Tablezajęć , ale znowu mogą ci pomóc jasne przykłady na stronie rubyguides.com. Jedną z rzeczy, które podkreślę, jest to, że kiedy powiesz, .parseże oczekujesz nagłówków, wynikowa tabela potraktuje pierwszy wiersz danych jako wiersz [0].

Prawdopodobnie będziesz szczególnie zainteresowany .by_colmetodą dostępną dla twojego nowego Tableobiektu. Pozwoli to na iterację przez różne pozycje indeksu kolumn na wejściu i / lub wyjściu i skopiowanie z jednej do drugiej lub dodanie nowej wartości do wyniku. Jeśli sprawię, że zadziała, wrócę i opublikuję przykład.

Tyler James Young
źródło