From: Rob Biedenharn Date: 2009-04-28T04:36:16+09:00 Subject: Re: Group several lines into one line On Apr 27, 2009, at 2:59 PM, Jesús Gabriel y Galán wrote: > On Mon, Apr 27, 2009 at 8:25 PM, Dirk Dre wrote: >> After sitting at this problem for hours without much progress, now is >> the time that I need your help. Btw. I'm quite new to ruby. >> >> I have a file that looks like this: >> >> 00-04-00;Austragungssystem für längliche oder >> 00-04-00;quadratische Lagerräume inklusive 3- >> 00-04-00;poligen Wielandstecker/Gegenstecker >> 00-04-00;Technische Daten: >> 00-04-00;Elektrischer Anschluss: 230V / 50Hz >> 00002274;Wilo Temperaturfühler TF >> 00002274;Temperaturschalter mit Einstellknopf >> 00002274;einschließlich 2 Stück Federspannbändern >> 00002274;zum Anlegen an Rohre bis DN 100. >> 00002274;Max. Betriebsspannung: 250 V >> 00002274;Max. Schaltleistung: 4 A >> 00002274;Schutzart: IP 43 >> 00002274;Schaltbereich: 30 oC bis 90 oC >> 00002274;Fabrikat: WILO >> 00002274;Typ: Temperaturschalter TF >> >> what i need is to group lines with the same serialnumber >> (eg. 00-04-00, 00002274) into one line like this: >> >> 00-04-00;Austragungssystem für längliche oder quadratische Lagerräume >> inklusive 3-poligen Wielandstecker/Gegenstecker Technische Daten: >> Elektrischer Anschluss: 230V / 50Hz > > > Something like this (untested) might get you started: > > s = "00-40..." #your string > h = Hash.new {|h,k| h[k] = ""} > s.each do |line| > key, value = line.split(";") > h[key] << value.chomp > end > > This will give you a hash where the keys are the serial numbers and > the values, the concatenated parts that correspond to that serial > number. > > Jesus. current_serial = nil texts = [] File.open(outputfilename, 'w') do |out| File.foreach(filename) do |line| serial, text = line.chomp.split(';', 2) if current_serial && serial != current_serial out.puts "#{current_serial};#{texts.join(' ')}" texts = [] end current_serial = serial texts << text end if current_serial out.puts "#{current_serial};#{texts.join(' ')}" end end Two things of note: The second argument to split(';', 2) limits the result to 2 items so if there happens to be a ';' later in the line it isn't considered a place to split. Keeping the items in a hash doesn't guarantee the order on the way back out, but I'm also assuming that all the lines with a given serial number are together. You have to initialize your filename and outputfilename, of course. -Rob Rob Biedenharn http://agileconsultingllc.com Rob@AgileConsultingLLC.com