31 lines
1.1 KiB
Ruby
31 lines
1.1 KiB
Ruby
#
|
|
# Nur neue Buchungsbewegungen exportieren, Zeile für Zeile (Streaming)
|
|
# Ein zweiter Lauf ohne neue Daten schreibt nichts.
|
|
#
|
|
# bin/etl run examples/bewegungen_inkrementell.rb [--out=tmp]
|
|
#
|
|
require 'fileutils'
|
|
require 'datapipeline'
|
|
|
|
DATA = File.expand_path('data', __dir__)
|
|
out = DataPipeline.params.fetch(:out, 'tmp')
|
|
FileUtils.mkdir_p(out)
|
|
|
|
DataPipeline.new do
|
|
streamed
|
|
|
|
# höchste id des letzten erfolgreichen Laufs, gespeichert in tmp/.state.json
|
|
stand = watermark :bewegungen, column: 'id', file: "#{out}/.state.json", initial: 0
|
|
|
|
# bei einer Datenbank gehört der Filter ins SQL: where id > $1, params: [stand.value]
|
|
read container(:json, file: "#{DATA}/bewegungen.ndjson")
|
|
filter { |row| row['id'] > stand.value.to_i }
|
|
map { |row| row.merge('soll_haben' => row['betrag'].negative? ? 'H' : 'S', 'betrag' => row['betrag'].abs) }
|
|
|
|
write container(:json,
|
|
file: "#{out}/bewegungen_#{Time.now.strftime('%Y%m%d_%H%M%S')}.ndjson"
|
|
)
|
|
|
|
on_finish { |stats| puts "neu: #{stats.written}, Stand jetzt: #{stand.current}" }
|
|
end.run
|