Stream Problem



  • Wow Danke doch sowas in der art stand da drin 🙂 jetzt kann ich die md's auch aus der schleife benutzen 🙂
    aber er schreibt immeroch nicht die kompltten daten (die er aus der console aber geben kann ) in die csv ? warum ?



  • Weil du den Code nicht verstehst.

    Mal ne ganz andere Frage: Wenn du Ruby auf deinem Rechner hast, warum willst du dann C++ für diese Aufgabe benutzen? Ruby ist deutlich geeigneter.


  • Mod

    Cevin19994 schrieb:

    aber er schreibt immeroch nicht die kompltten daten (die er aus der console aber geben kann ) in die csv ? warum ?

    Zum dritten und letzten Mal:

    SeppJ schrieb:

    Das ist zwar nicht die Lösung,

    Das war nicht das was du suchtest, weil das Programm ganz was anderes macht, als du denkst. Die Antwort war deher nur technisch korrekt, nicht hilfreich.



  • Michael E. schrieb:

    Weil du den Code nicht verstehst.

    Mal ne ganz andere Frage: Wenn du Ruby auf deinem Rechner hast, warum willst du dann C++ für diese Aufgabe benutzen? Ruby ist deutlich geeigneter.

    Ich habe mit c++ schon viele einfache konsolen anwendungen gemacht
    da dachte ich währe es vom vorteil wenn ich für diese aufgabe auch c++ nehme da ich von ruby garkeine ahnung habe

    das ruby geeigneter ist wusste ich daher habe ich mich mal dran versucht
    aber wenn man englisch nicht beherrscht ist das lernen ohne deutsche bücher noch einmal ne nummer schwieriger
    und von c++ hab ich mehr als genug lern material ( was sich jetzt blöd anhört weil ich dafür mehr als genug fragen habe 😮 )

    Das war nicht das was du suchtest, weil das Programm ganz was anderes macht, als du denkst. Die Antwort war deher nur technisch korrekt, nicht hilfreich.

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?


  • Mod

    Cevin19994 schrieb:

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?

    Tut mir leid, aber ich habe die Geduld mit dir verloren.



  • SeppJ schrieb:

    Cevin19994 schrieb:

    Ok dann wenn ich es nicht weiß ... dann sag du mir ... was macht das programm ?

    Tut mir leid, aber ich habe die Geduld mit dir verloren.

    ähm ja ich hab dir schon 2 mal gesagt wenn ich dir es nicht recht machen kann dann lass es mir zu helfen ....


  • Mod

    Cevin19994 schrieb:

    ähm ja ich hab dir schon 2 mal gesagt wenn ich dir es nicht recht machen kann dann lass es mir zu helfen ....

    Tue ich ja auch nicht mehr. Wollte dich nur informieren, damit du dich nicht wunderst, wieso ich deine direkte Frage nicht beantworte.



  • 😃 Das ar ich von dir sowieso schon gewohnt 😛



  • Cevin19994 schrieb:

    Ich habe mit c++ schon viele einfache konsolen anwendungen gemacht
    da dachte ich währe es vom vorteil wenn ich für diese aufgabe auch c++ nehme da ich von ruby garkeine ahnung habe

    Nichts für ungut, aber wenn du nicht mal die Syntax einer for-Schleife beherrschst, kann es um deine C++-Kenntnissen auch nicht viel besser stehen.

    das ruby geeigneter ist wusste ich daher habe ich mich mal dran versucht
    aber wenn man englisch nicht beherrscht ist das lernen ohne deutsche bücher noch einmal ne nummer schwieriger

    Man braucht keine Supidupi-Englischkenntnisse, um ein Programmierbuch verstehen zu können. Außerdem gibt es Ruby-Literatur auf Deutsch, sogar kostenlos. Ohne übertreiben zu wollen, kann man dein Problem in fünf Zeilen lösen.



  • Ja ich weiß ... ich hab wohl etwas gelogen damit keine fragen kommen ... in ruby hab ich das ganze schon gelöst ... ich will es aber auch gerne in c++ haben um eben mehr zu lernen ... und bitte erzählt mir nicht das man so nicht lernt ... jeder hat seine eigene art zu lernen ...
    so hab ich es in ruby gelöst .... dürfte ich den die 5 magischen zeilen zum lösen meines problem haben ?

    #!/usr/bin/env ruby
    # encoding: utf-8
    
    require 'rubygems'
    require 'csv'
    require 'bundler'
    Bundler.require(:default)
    
    module CommandLineFlags extend OptiFlagSet
      # (port: 55672) # http://localhost:55672/#/
      optional_flag "folder"
      optional_flag "output"
    
      and_process!
    end 
    
    folder = ARGV.flags.folder || Dir.pwd
    output = ARGV.flags.output || "#{Time.now}_output.csv"
    
    puts "Value extractor"
    puts "============================="
    puts "Output file: '#{output}'"
    puts "============================="
    
    def get_md_files(path)
      files = []
      Dir.foreach(path) do |entry|
        next if (entry == '..' || entry == '.')
        full_path = File.join(path, entry)
        if File.directory?(full_path)
          files += get_md_files(full_path)
        else
          files << full_path if ".md" == File.extname(entry)
        end
      end
      return files
    end
    
    def extract_values(files)
      keys = []
      grid = {}
    
      prefilter = /[(.*)]/
      scanvalue = /([0-9]{4}-[0-9]{2}-[0-9]{2}).*\|(\w*)=([\w,.]*)/
    
      files.each do |path|
        content = File.read(path)
        content.scan(prefilter) { |bracket| 
          #ap bracket.to_s
          bracket.to_s.scan(scanvalue) { |date,key,value| 
            # normalize that german numbers
            #date = Date.parse date
            #date = date.strftime("%Y-%m-%d")
            value = value.gsub(',', '.').to_f
            #ap "date: #{date}, key: #{key}, value: #{value}" 
    
            # sort the values
            keys.push(key).uniq!
            grid[date] = {} if grid[date].nil?
            grid[date][key] = 0 if grid[date][key].nil?
            grid[date][key] += value
    
            puts "date: #{date}, key: #{key}, value: #{value} for #{bracket}" 
            puts "#{date} => #{grid[date]}"
          }
        }
      end
        puts "================"
      ap grid
      ap keys
    
      return keys, grid
    end
    
    def write_csv(keys, grid, output)
       header = ["date"]
       keys.each do |key|
         header << key
       end
    
       CSV.open(output, "wb") do |csv|
         csv << header
    
         grid.each do |date, values|
           row = [date]
    
           keys.each do |key|
             puts "grid: #{grid[date][key]}"
             row << grid[date][key] || ''
           end
    
           ap row
           csv << row
         end
       end
    end
    
    # Structure
    # =========
    
    # Get all .md files from tree
    files = get_md_files(folder)
    
    # parse every file in the list for the pattern [2012-10-04 17:14|key=2]
      # put the keys into an array
      # put and aggregate the files into a nested hashmap
    keys,grid = extract_values(files)
    
      puts " WRITE CSV ================"
    # output all the hashmap into a csv
    write_csv(keys, grid, output)
    


  • Cevin19994 schrieb:

    ich hab wohl etwas gelogen damit keine fragen kommen ...

    Beste Voraussetzungen für Hilfe.

    in ruby hab ich das ganze schon gelöst ...

    Das kaufe ich dir beim besten Willen nicht ab.



  • Das mit dem lügen tut mir ja leid aber ich musste leider feststellen das der ton nicht immer freundlich ist hier ...

    ob du es mir ankaufst oder nicht ist gerne die überlassen
    das war mal eine aufgabe die ich machen musste um ein Praktikum in einer firma zu bekommen ... naklar hatte ich da auch hilfe ...
    nur jetzt versuche ich das in c++ umzusetzten



  • Keine Ahnung, warum ich das mach. Verdient hast dus dir eigentlich nicht.

    #!/usr/bin/env ruby
    # encoding: utf-8
    
    require 'rubygems'
    require 'csv'
    require 'bundler'
    Bundler.require(:default)
    

    Wofür die ganzen Includes?

    module CommandLineFlags extend OptiFlagSet
      # (port: 55672) # http://localhost:55672/#/
      optional_flag "folder"
      optional_flag "output"
    
      and_process!
    end
    
    folder = ARGV.flags.folder || Dir.pwd
    output = ARGV.flags.output || "#{Time.now}_output.csv"
    

    Zusätzliche Funktionalität, von der keine Rede war.

    def get_md_files(path)
      files = []
      Dir.foreach(path) do |entry|
        next if (entry == '..' || entry == '.')
        full_path = File.join(path, entry)
        if File.directory?(full_path)
          files += get_md_files(full_path)
        else
          files << full_path if ".md" == File.extname(entry)
        end
      end
      return files
    end
    

    Tut dasselbe wie

    Dir["#{path}/**/*.md"]
    
    def extract_values(files)
      keys = []
      grid = {}
    
      prefilter = /[(.*)]/
      scanvalue = /([0-9]{4}-[0-9]{2}-[0-9]{2}).*\|(\w*)=([\w,.]*)/
    
      files.each do |path|
        content = File.read(path)
        content.scan(prefilter) { |bracket| 
          #ap bracket.to_s
          bracket.to_s.scan(scanvalue) { |date,key,value| 
            # normalize that german numbers
            #date = Date.parse date
            #date = date.strftime("%Y-%m-%d")
            value = value.gsub(',', '.').to_f
            #ap "date: #{date}, key: #{key}, value: #{value}" 
    
            # sort the values
            keys.push(key).uniq!
            grid[date] = {} if grid[date].nil?
            grid[date][key] = 0 if grid[date][key].nil?
            grid[date][key] += value
    
            puts "date: #{date}, key: #{key}, value: #{value} for #{bracket}" 
            puts "#{date} => #{grid[date]}"
          }
        }
      end
        puts "================"
      ap grid
      ap keys
    
      return keys, grid
    end
    

    Die Keys brauchen wir hier noch nicht. Die ganzen Initialisierungen (if ...nil?) braucht man nicht, wenn man grid ordentlich definiert. Die Aufteilung auf zwei reguläre Ausdrücke ist überflüssig. Nach Rauswerfen der get_md_files-Funktion bleibt hier noch übrig:

    def extract_values(folder)
      grid = Hash.new{|hash, key| hash[key] = Hash.new(0)} 
      scanvalue = /[(\d{4}-\d{2}-\d{2}).*\|(\w*)=([\w,.]*)]/
    
      Dir["#{folder}/**/*.md"].each do |path|
        File.read(path).scan(scanvalue) { |date,key,value|
            grid[date][key] += value.gsub(',', '.').to_f
        }
      end
      grid
    end
    
    def write_csv(keys, grid, output)
       header = ["date"]
       keys.each do |key|
         header << key
       end
    

    ➡

    header = ["date"] + keys
    
    CSV.open(output, "wb") do |csv|
    

    wb?

    csv << header
    
         grid.each do |date, values|
           row = [date]
    
           keys.each do |key|
             puts "grid: #{grid[date][key]}"
             row << grid[date][key] || ''
           end
    
           ap row
           csv << row
         end
       end
    end
    

    Was ist ap eigentlich? Verkürzt sich zu:

    def write_csv(grid, output)
       keys = grid.values.map(&:keys).flatten.uniq
       CSV.open(output, "w") do |csv|
         csv << ["date"] + keys
         grid.each {|date, values| csv << [date] +keys.map{|key| values[key]}}
       end
    end
    
    # Structure
    # =========
    
    # Get all .md files from tree
    files = get_md_files(folder)
    
    # parse every file in the list for the pattern [2012-10-04 17:14|key=2]
      # put the keys into an array
      # put and aggregate the files into a nested hashmap
    keys,grid = extract_values(files)
    
      puts " WRITE CSV ================"
    # output all the hashmap into a csv
    write_csv(keys, grid, output)
    

    Fällt weg, wenn man die nun sowieso kurzen Funktionen weglässt. Übrig bleibt also insgesamt:

    require 'csv'
    
    grid = Hash.new {|hash, key| hash[key] = Hash.new(0) }
    Dir["#{Dir.pwd}/**/*.md"].each do |path|
      File.read(path).scan /[(\d{4}-\d{2}-\d{2}).*\|(\w*)=(.*)]/ do |date,key,value|
          grid[date][key] += value.gsub(',', '.').to_f
      end
    end
    keys = grid.values.map(&:keys).flatten.uniq
    CSV.open "output.csv", "w" do |csv|
      csv << ["date"] + keys
      grid.each {|date, values| csv << [date] + keys.map {|key| values[key] } }
    end
    

    Hmm, noch keine fünf Zeilen, wenn man die Zeilen nicht überlang macht... Sollte aber für den Anfang reichen.

    Edit: Wer drauf steht:

    grid = Hash.new {|hash, key| hash[key] = Hash.new(0) }
    Dir["#{Dir.pwd}/**/*.md"].each do |path|
      File.read(path).scan(/[(\d{4}-\d{2}-\d{2}).*\|(\w*)=(.*)]/){|date,key,value| grid[date][key] += value.gsub(',', '.').to_f }
    end
    keys = grid.values.map(&:keys).flatten.uniq
    File.open("output.csv","w"){|f| f << (["date"] + keys)*',' + "\n" + grid.map{|d,v| ([d] + keys.map {|key| v[key] })*','}*"\n" }
    

    Also nur noch eine Zeile zu viel.



  • Wow danke 🙂 hätte ich zwar vor 2 wochengebrauchen können ( hätte ja mal früher posten können zur überprüfung ) aber danke
    Hmm ich denke mal wenn ich mit dem c++ code fertig bin giebt es da auch noch maßenhaft zu verbessern 🙂


Anmelden zum Antworten