datapipeline 2.0.0: Gem aus dem Projekt etl herausgelöst

This commit is contained in:
wkh
2026-10-08 15:30:02 +02:00
commit cce7b03ca9
56 changed files with 5205 additions and 0 deletions
+38
View File
@@ -0,0 +1,38 @@
#
# Eigenes Plugin: liest alle CSV-Dateien eines Verzeichnisses als eine Quelle
#
# bin/etl run examples/eigenes_plugin.rb [--out=tmp]
#
require 'fileutils'
require 'datapipeline'
DATA = File.expand_path('data', __dir__)
out = DataPipeline.params.fetch(:out, 'tmp')
FileUtils.mkdir_p(out)
class VerzeichnisStorage < DataPipeline::StoragePlugin
def initialize dir:, pattern: '*.csv', **csv_options
@dir = dir
@pattern = pattern
@csv_options = csv_options
end
# jede Zeile bekommt den Dateinamen dazu; mit Block zeilenweise (für streamed)
def read(&block)
rows = Dir.glob(File.join(@dir, @pattern)).sort.flat_map do |file|
DataPipeline::CsvStorage.new(file:, **@csv_options).read.map { |row| row.merge('datei' => File.basename(file, '.*')) }
end
return rows unless block
rows.each(&block)
nil
end
end
DataPipeline.register :verzeichnis, VerzeichnisStorage
DataPipeline.new do
read container(:verzeichnis, dir: "#{DATA}/filialen")
map { |row| row.merge('menge' => row['menge'].to_i) }
write container(:csv, file: "#{out}/alle_filialen.csv", columns: %w[datei artikel menge])
end.run