Witam, musze napisac skrypt w rubim który bedzie sprawdzał zmiany w folerze plików csv, nastepnie te plik parsowal ieksportowal zawartośc tych plikow do SQL pod warunkiem ze rekordów z taka zawartosciua nie ma w bazie.
mam to:
require ‘filewatcher’
FileWatcher.new(["/home/*.csv"]).watch() do |filename, event|
if(event == :changed)
puts "File updated: " + filename
end
if(event == :new)
puts "Added file: " + filename
end
end
zasada dzialania ma byc taka, jak wystapila zmiana w pliku to caly plik CSV (linia po linii) ma przeleciec i kazda linie sprawdzac w bazie czy istnieje (np po pierwszym poli) jezeli tak to nastepna linia, jezeli nie to ma dodac do bazy linię z pliku CSV.
niby proste, ale…
czy moze ktoś pomoc?
nie o to chodzi aby ktoś za mnie pisal, ale klepie kod juz troche czasu i mi nie wychodzi, mam cos takiego
require 'csv'
require 'tiny_tds'
require 'filewatcher'
def mcsv(plik)
client = TinyTds::Client.new username: 'sa', password: 'test', dataserver: 'serwer'
CSV.open(plik, "r:bom|utf-8" , { :col_sep => ';', headers: false } ) do |csv|
csv.each do |row|
sql = "SELECT count() FROM [baza].[dbo].[Event] where idudp = #{row[0]}"
result = client.execute(sql)
unless result.affected_rows == 0
sql2 = "INSERT INTO [baza].[dbo].[Event]([idudp],[dataudp],[timeudp],[userudp],[envudp]) VALUES (#{row[0]},'#{row[1]}','#{row[2]}',#{row[3]},#{row[4]}
client.execute(sql2)
result2 = client.execute(sql2)
result2.do
result2.cancel
puts "Added: " + row[0]
end
result.cancel
end
end
client.close
end
FileWatcher.new(["/home/robert/*.csv"]).watch() do |filename, event|
if(event == :changed)
puts "File updated: " + filename
mcsv(filename)
end
if(event == :delete)
puts "File deleted: " + filename
end
if(event == :new)
puts "Added file: " + filename
mcsv(filename)
end
end
gdzie po uruchomieniu w wgraniu do folderu pliku csv, dostaje komunikat:
File updated: /home/robert/2015-11-20.csv
dispatcher.rb:17:in execute': Attempt to initiate a new Adaptive Server operation with results pending (TinyTds::Error) from dispatcher.rb:17:inblock (2 levels) in mcsv’
from /usr/lib/ruby/2.1.0/csv.rb:1722:in each' from dispatcher.rb:12:inblock in mcsv’
from /usr/lib/ruby/2.1.0/csv.rb:1268:in open' from dispatcher.rb:11:inmcsv’
from dispatcher.rb:34:in block in <main>' from /var/lib/gems/2.1.0/gems/filewatcher-0.5.2/lib/filewatcher.rb:55:inwatch’
from dispatcher.rb:31:in `’
nie bardzo znam sie na ruby, to wlasciwie moj pierwszy skrypt.