Skrypy ruby filewatcher + csv + sql

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?

No ale z czym masz problem? Jakieś konkretne pytanie czy po prostu, czy ktoś mi to napisze?

1 Like

Model.where(query).first_or_create ? i jedziesz :wink:

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.

juz sobie poradzilem, temat mozna zamnknac