jak číst a analyzovat soubory CSV s Ruby

CSV znamená „hodnoty oddělené čárkami“.

je to běžný datový formát, který se skládá z řádků s hodnotami oddělenými čárkami. Používá se pro export & import dat.

například:

kontakty Gmailu můžete exportovat jako soubor CSV a můžete je také importovat pomocí stejného formátu.

takto vypadá soubor CSV:

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

nyní se naučíte, jak používat knihovnu Ruby CSV ke čtení & psát soubory CSV.

Ruby CSV Parsing

Ruby je dodáván s vestavěnou knihovnou CSV.

soubor si můžete přečíst přímo:

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

nebo můžete analyzovat řetězec s daty CSV:

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

výsledek?

získáte dvourozměrné pole, kde každá položka je jeden řádek v tabulce.

vypadá to takto:

, , , , , ]

pro práci s těmito daty můžete použít indexy pole jako data.

ale existuje lepší způsob!

možnosti CSV

pokud má váš soubor záhlaví, můžete říct analyzátoru CSV, aby je použil.

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

nyní místo vícerozměrného pole získáte objekt tabulky CSV.

zde je popis:

CSV::Table je dvourozměrná datová struktura pro reprezentaci dokumentů CSV. Tabulky umožňují pracovat s daty podle řádku nebo sloupce, manipulovat s daty a dokonce převádět výsledky zpět do formátu CSV.“

vzhledem k jedné z těchto tabulek můžete získat potřebná data z libovolného řádku.

Příklad:

table# "1"table# "chocolate"

Zde 0 je první řádek, id & name jsou názvy sloupců.

existují dva režimy tabulky:

  • by_col
  • by_row

změnou režimu tabulky (row ve výchozím nastavení), můžete se podívat na data z různých úhlů.

například:

table.by_col# table.by_col# 

Zde 0 první sloupec 1 je druhý sloupec.

tyto dvě metody vrátí kopii tabulky.

pokud chcete provést změny v původní tabulce, můžete použít metody by_col! & by_row!.

to bude více paměti efektivní, protože žádná kopie tabulky je vytvořena.

jak používat převaděče CSV

možná jste si všimli, že jsme dostali náš sloupec id jako pole řetězců.

co když potřebujeme celá čísla?

můžete je získat voláním to_i na každém řetězci …

ale existuje zkratka!

Knihovna Ruby CSV implementuje něco, co se nazývá konvertory.

převodník automaticky převede hodnoty za vás.

například:

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

k dispozici je 6 vestavěných převodníků:

  • Integer
  • Float
  • Numeric (Float + celé Číslo)
  • Datum
  • DateTime

Ale můžete si také vytvořit svůj vlastní konvertory.

Zde je návod, jak:

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

můžete použít svůj nový katalyzátor, jako je tento:

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

Jak Vytvořit Nový Soubor CSV

Na vrcholu je schopen analyzovat & čtení CSV souborů v různých způsobů, jak můžete také vytvořit CSV od nuly.

to je snadný způsob, jak:

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

můžete také použít metodu 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 })# 

zde je srovnání výkonu:

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

shrnutí

naučili jste se číst & psát soubory CSV v Ruby! Také jste se dozvěděli o konvertorech & alternativní Ruby drahokamy pro zpracování vašich dat CSV.

pokud chcete zpracovávat velké soubory CSV (> 10 MB), můžete použít metodu CSV.foreach(file_name) s blokem. To bude číst jeden řádek v době & použít mnohem méně paměti.

prosím, sdílejte tento článek, aby ho mohlo najít více lidí!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.