Stream Problem
-
Um den Thread mal zu beenden:
MD md; for( ; fin >> md ; ) { // ... }
Oder besser gleich
MD md; while (fin >> md) { // ... }
Wenn in deinem C++ Buch wirklich nicht drin steht, wie man for in while Schleifen (und umgekehrt) überführen kann, dann würde es mich schon sehr wundern.
-
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.
-
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 habedas 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 ?
-
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 ....
-
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 habeNichts 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 schwierigerMan 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