Wie erstelle ich eine Kopie einiger Spalten einer CSV-Datei in Ruby mit unterschiedlichen Daten in einer Spalte?


84

Ich habe eine CSV-Datei namens "A.csv". Ich muss eine neue CSV-Datei namens "B.csv" mit Daten von "A.csv" generieren.

Ich werde eine Teilmenge von Spalten aus "A.csv" verwenden und muss die Werte einer Spalte auf neue Werte in "B.csv" aktualisieren. Letztendlich werde ich diese Daten von B.csv verwenden, um sie gegen eine Datenbank zu validieren.

  1. Wie erstelle ich eine neue CSV-Datei?
  2. Wie kopiere ich die Daten der erforderlichen Spalten von A.csv nach "B.csv"?
  3. Wie füge ich Werte für eine bestimmte Spalte hinzu?

Ich bin neu in Ruby, aber ich kann CSV lesen, um ein Array oder einen Hash zu erhalten.


2
Hier fehlen grundlegende Informationen, z. B. zeigen Sie uns Ihre Bemühungen zur Lösung des Problems. Diese Informationen finden Sie in der CSV-Dokumentation. Lesen Sie " How to Ask " und " Minimal reproduzierbares Beispiel ".
der Blechmann

Mögliches Duplikat des Output-Arrays in CSV in Ruby
Phunehehe

Antworten:


189

Wie Mikeb betonte, gibt es die Dokumente - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - oder Sie können den folgenden Beispielen folgen (alle sind getestet und Arbeiten):

So erstellen Sie eine neue Datei:

In dieser Datei haben wir zwei Zeilen, eine Kopfzeile und eine Datenzeile, sehr einfache CSV:

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

Ergebnis ist eine Datei namens "file.csv" mit folgenden Angaben:

animal,count,price
fox,1,$90.00

So hängen Sie Daten an eine CSV an

Fast die gleiche Formel wie oben, nur anstatt den "wb" -Modus zu verwenden, verwenden wir den "a +" - Modus. Weitere Informationen hierzu finden Sie in dieser Antwort zum Stapelüberlauf: Welche Modi und Optionen für Ruby File.open gibt es?

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

Wenn wir jetzt unsere Datei file.csv öffnen, haben wir:

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

Lesen Sie aus unserer CSV-Datei

Jetzt wissen Sie, wie Sie eine Datei kopieren und in eine Datei schreiben, eine CSV lesen und daher die Daten zur Manipulation abrufen, die Sie gerade ausführen:

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

Dies ist natürlich eine von hundert verschiedenen Möglichkeiten, wie Sie mit diesem Juwel Informationen aus einer CSV abrufen können. Für weitere Informationen empfehle ich, die Dokumente zu besuchen, sobald Sie eine Grundierung haben: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


Was ist, wenn ich öffnen möchte, ohne sofort zu schreiben? Verwenden Sie den Block einfach nicht?
Donato

Vielen Dank für den Code zum Kopieren und Einfügen! - zu faul, um es zu schreiben.
DominikAngerer

Dies umfasst das Erstellen einer neuen CSV, geht dann aber auf Informationen zum Hinzufügen und Lesen ganzer Zeilen ein, anstatt die Anforderung zu adressieren, eine Teilmenge der verfügbaren Spalten zu kopieren und deren Werte entweder zu ändern oder zu ergänzen. Ich habe die gleiche Art von Projekt wie das OP und wurde weder von der Dokumentation noch von dieser Antwort unterstützt. Hoffentlich kann ich hierher zurückkehren, um eine genauere Antwort zu geben, sobald ich es herausgefunden habe.
Tyler James Young


0

Sie werden wahrscheinlich verwenden wollen CSV::parse Ruby helfen, Ihre CSV als Datentabelle zu verstehen und einen einfachen Zugriff auf Werte per Header zu ermöglichen.

Leider ist die verfügbare Dokumentation zur CSV::parseMethode nicht sehr deutlich, wie sie tatsächlich für diesen Zweck verwendet werden soll.

Ich hatte eine ähnliche Aufgabe und wurde viel mehr von How to Read & Parse CSV Files With Ruby unterstützt Parsen von auf rubyguides.com unterstützt als durch die Dokumentation der CSV-Klasse oder durch die Antworten, die von hier darauf verweisen.

Ich empfehle, diese Seite vollständig zu lesen. Der entscheidende Teil besteht darin, eine bestimmte CSV in ein CSV::TableObjekt umzuwandeln, indem:

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

Jetzt gibt es eine Dokumentation zur CSV::TableKlasse , aber auch hier können Ihnen die klaren Beispiele auf der Seite rubyguides.com mehr helfen. Eine Sache, die ich hervorheben werde, ist, dass .parsedie resultierende Tabelle die erste Datenzeile als Zeile behandelt , wenn Sie angeben , dass Header erwartet werden sollen [0].

Sie werden wahrscheinlich besonders an der .by_colMethode interessiert sein, die für Ihr neues TableObjekt verfügbar ist . Auf diese Weise können Sie verschiedene Spaltenindexpositionen in der Eingabe und / oder Ausgabe durchlaufen und entweder von einer zur anderen kopieren oder der Ausgabe einen neuen Wert hinzufügen. Wenn es funktioniert, komme ich zurück und poste ein Beispiel.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.