2017-11-27 1 views
-1

Ich habe ein Problem mit dieser Zeile File.foreach ('ojo.txt'). with_object ([]) do | line, result | Zeile für Zeile einer Datei gehen, weil ich es brauche, um die ersten drei Zeichen einer Datei Bestellung zu entschlüsseln. mein Problem ist, zum Zeitpunkt der Speicherung des folgenden und ich in diesem Zyklus bin do ich leer Aufzeichnungen speichert ... und eine Zeit, in dem analyises kommt, dass Beispiel:Probleme beim Analysieren und Speichern von Dateien in Ruby

LIN00000100635818000159EN 
IMDF CU VINO S EMA 14.5G CATAL PREM BOT 75 
QTY 21000000000000001SIN 
QTY129000000000000001SIN 
MOA203000000000016338.00 
PRIAAA000000021498.00LIUSIN 
ALCA DE1 
PCD 10000024.00 
MOA204000000000005160.00 
ALCC CA1 
MOA 23000000000000180.00 

das sind die Linien Verwendung if line.start_with? ('LIN') zu analysieren und dann dekodieren. aber diese sechs 11 Zeilen möchte ich zusammen analysieren, weil in einer Datei X die Menge der Produkte in wenigen Wörtern viele Male wiederholt wird. So wie ich es mache, hält mich nur der erste Artikel, die anderen nicht.

zusätzlich möchte ich, wenn möglich, einen Bericht mit einem Datensatz und dem Detail dieses Datensatzes auf eine etwas einfache Art erzeugen. Ich bin neu in Ruby.

Ich füge meinen Code an und sehe, könntest du mir helfen.

  File.foreach('ojo.txt').with_object([]) do |line, result| 
      if lines.start_with?('LIN') 
       @cproducto = lines[8..-2] 
      end 
       if lines.start_with?('IMD') 
        @desproducto = lines[8..-1] 
       end 
      if lines.start_with?('QTY 21')      
        @cantidadpedida = lines[-5..-4]    
        caja = lines[-3..-1] 
        if caja = ('CSC') 
         @tcaja = 'cajas de carton' 
        end 
        if pedido = ('CS') 
         @tcaja= 'cajas' 
        end 
        if pedido = ('SIN') 
         @tcaja= 'Uunidades Simples' 
        end 
        if pedido = ('KGM') 
         @tcaja= 'Kilogramos' 
        end 
      end  
      if lines.start_with?('QTY129') 
       @cantidadunidades = lines[-6..-4]        
       @tunidad = 'Unidades Simples' 
      end       
      if lines.start_with?('MOA 203')     
       @precio = 'Precio neto' 
       @precioneto = lines[-10..-1] 
      end 
      if lines.start_with?('MOA 23')     
       @tcargo = 'Cargo' 
       @valorcargo = lines[-10..-1] 
      end 
      if lines.start_with?('MOA 203')     
       @precio = 'Precio neto' 
       @precioneto = lines[-10..-1] 
      end 
      if lines.start_with?('MOA 204')     
       @tdescu = 'Descuento' 
       @valordescu = lines[-10..-1] 
      end 

      if lines.start_with?('PRIAAA') 
        pedido = lines[-3..-1] 
        @valorcd = lines[-16..-8]        
       if pedido = ('CSC') 
        @tcaja2 = 'cajas de carton' 
       end 
       if pedido = 'CS' 
        @tcaja2 = 'cajas' 
       end        
      end 

       if lines.start_with?('ALCA') and (lines.include?('DE1') or lines.include?('DE2')) 
        @cdescuento = 'DESCUENTO'    
       end 
       if lines.start_with?('ALCC') and (lines.include?('CA1') or lines.include?('CA1'))    
        @ccargo = 'CARGO'   
       end 

       if lines.start_with?('PCD') and (lines[5] = '1')      
        porcentaje = lines[-6..-1] 
        @porecentaje = 'porcentaje de descuento' 
       else 
        @porecentaje = 'porcentaje del cargo' 
       end 

      if lines.start_with?('MOA 86') 
       clave  = lines[0..2]    
       importe = lines[-9..-1]    

      end 
      if lines.start_with?('CNT')        
       @items2 = lines[-2..-1]  
      end 
end 
     Detalles2s.create(descrip: @desproducto, tipebox: @tcaja , cantidad: @cantidadunidades, tipounidad: @tunidad , precio: @precio, precioneto: @precioneto) 

so etwas um die Linien zu analysieren, aber das nicht

if line.start_with?('LIN') and not line.start_with?('IMD') and lines.start_with?('QTY 21') and lines.start_with?('QTY129') and lines.start_with?('MOA 203') and (lines.start_with?('MOA 204') or lines.start_with?('MOA 23')) and lines.start_with?('PRIA') and lines.start_with?('PCD') and (lines.start_with?('ALCA') or lines.start_with?('ALCC')) 
+0

Als ersten Schritt führen Rubin mit dem '-w' Option, und korrigieren Sie alle' Warnung: gefunden = bedingte, sollte '== werden. – BernardK

Antwort

0

Viele aufeinanderfolgende if ‚s die gleiche CPU-Zeit zu testen funktioniert verschwendet, weil, wenn eine Linie mit LIN beginnt, die andere if Es wird ausgeführt werden, aber niemals wahr sein. Eine case-Anweisung beendet den Vergleich, sobald eine when-Klausel erfüllt ist.

DRY = Wiederholen Sie sich nicht. Sie haben zweimal if pedido == ('CS'). Alle Tests über pedido sind besser an einem Ort zusammengefasst, dies erleichtert die Wartung des Programms auf lange Sicht.

Es gibt viele Möglichkeiten, Dinge in Ruby zu tun. Das folgende Programm gibt Ihnen einen Vorgeschmack auf die Lösung.

class Detalles2s 
    attr_accessor :cproducto, :cantidadunidades, :desproducto, :precio, 
        :precioneto, :tcaja, :tunidad 

    def analyze 
     File.foreach('ojo.txt') do | line | 
      line = line.chomp # remove CrLf (\r\n) 
      puts "processing line #{line} ..." 

      case 
      when line.start_with?('LIN') 
       @cproducto = line[8..-2] 
       puts "@cproducto=#{@cproducto}" 
      when line.start_with?('IMD') 
       @desproducto = line[8..-1] 
      when line.start_with?('QTY 21')      
       @cantidadpedida = line[-5..-4]    
       caja = line[-3..-1] 
       pedido = '?????????????????????' 
       @tcaja = unitOfMeasure(pedido) 
      when line.start_with?('QTY129') 
       @cantidadunidades = line[-6..-4]        
       @tunidad = 'Unidades Simples' 
      when line.start_with?('MOA203') # not ('MOA 203')     
       @precio = 'Precio neto' 
       @precioneto = line[7..-1] # not [-10..-1] 
      when line.start_with?('MOA 23')     
       @tcargo = 'Cargo' 
       @valorcargo = line[-10..-1] 
      when line.start_with?('MOA 204')     
       @tdescu = 'Descuento' 
       @valordescu = line[-10..-1] 
      when line.start_with?('PRIAAA') 
       pedido = line[-3..-1] 
       @valorcd = line[-16..-8]        
       @tcaja2 = unitOfMeasure(pedido) 
      when (line.start_with?('ALCA') and (line.include?('DE1') or line.include?('DE2'))) 
       @cdescuento = 'DESCUENTO'    
      when line.start_with?('ALCC') && (line.include?('CA1') || line.include?('CA1'))    
       @ccargo = 'CARGO'   
      when line.start_with?('PCD') 
       if line[5] == '1' 
       then 
        porcentaje = line[-6..-1] # not used !!!!!!!!!!!!!!! 
        @porecentaje = 'porcentaje de descuento' 
       else 
        @porecentaje = 'porcentaje del cargo' 
       end 
      when line.start_with?('MOA 86') 
       clave = line[0..2]    
       importe = line[-9..-1]    
      when line.start_with?('CNT')        
       @items2 = line[-2..-1] 
      else 
       puts 'starts with something else' 
      end 
     end # foreach 
    end # analyze 

    def unitOfMeasure(p_pedido) 
     case p_pedido 
     when 'CS' then 'cajas' 
     when 'CSC' then 'cajas de carton' 
     when 'SIN' then 'Unidades Simples' 
     when 'KGM' then 'Kilogramos' 
     else 
      puts "bad unit #{p_pedido}" 
      'undefined' 
     end 
    end 
end #class Detalles2s 

un_producto = Detalles2s.new 
un_producto.analyze 
p un_producto 
puts "cproducto=#{un_producto.cproducto}" 
puts "desproducto=#{un_producto.desproducto}" 
puts "tcaja=#{un_producto.tcaja}" 
puts "cantidadunidades=#{un_producto.cantidadunidades}" 
puts "tunidad=#{un_producto.tunidad}" 
puts "precio=#{un_producto.precio}" 
puts "precioneto=#{un_producto.precioneto}" 

Ausführung:

$ ruby -w t.rb 
t.rb:18: warning: assigned but unused variable - caja 
t.rb:44: warning: assigned but unused variable - porcentaje 
t.rb:50: warning: assigned but unused variable - clave 
t.rb:51: warning: assigned but unused variable - importe 
processing line LIN00000100635818000159EN ... 
@cproducto=100635818000159EN 
processing line IMDF CU VINO S EMA 14.5G CATAL PREM BOT 75 ... 
processing line QTY 21000000000000001SIN ... 
bad unit ????????????????????? 
processing line QTY129000000000000001SIN ... 
processing line MOA203000000000016338.00 ... 
processing line PRIAAA000000021498.00LIUSIN ... 
processing line ALCA DE1 ... 
processing line PCD 10000024.00 ... 
processing line MOA204000000000005160.00 ... 
starts with something else 
processing line ALCC CA1 ... 
processing line MOA 23000000000000180.00 ... 
#<Detalles2s:0x007f90dfa1cbe8 @cproducto="100635818000159EN", @desproducto=" VINO S EMA 14.5G CATAL PREM BOT 75", @cantidadpedida="01", @tcaja="undefined", @cantidadunidades="001", @tunidad="Unidades Simples", @precio="Precio neto", @precioneto="00000000016338.00", @valorcd="0021498.0", @tcaja2="Unidades Simples", @cdescuento="DESCUENTO", @porecentaje="porcentaje de descuento", @ccargo="CARGO", @tcargo="Cargo", @valorcargo="0000180.00"> 
cproducto=100635818000159EN 
desproducto= VINO S EMA 14.5G CATAL PREM BOT 75 
tcaja=undefined 
cantidadunidades=001 
tunidad=Unidades Simples 
precio=Precio neto 
precioneto=00000000016338.00 
+0

hallo @bernarkk vor nichts danke für deine Zeit ... funktioniert die Kommandozeile weil es mir zeigt was es im Terminal geladen hat aber ich arbeite nicht die Speicherfunktion da sich in der Datenbank nichts ändert die .new um. Erstellen und sagt undefined Methode –

+0

Wenn Sie den Quellcode der Klasse 'Detalles2s' haben, müssen Sie' def self.create'. Ich kann wahrscheinlich nicht mit einer DB helfen, ich habe seit 40 Jahren keinen mehr benutzt. Sie können nicht vermeiden, genug Ruby zu lernen, um selbst zu tun, was Sie erreichen möchten. Niemand wird das ganze Programm für dich schreiben. Wenn Sie ein bestimmtes Problem haben, können Sie eine Frage stellen, siehe [how-to-ask] (https://stackoverflow.com/help/how-to-ask). – BernardK

+0

hallo bitte überprüfen sie das update der frage, analysieren sie mir die anderen aber nur die ersten. und natürlich verstehe ich, dass ich nicht nach dem Code suche, sondern ein bisschen Anleitung, bis eine Idee dazu dient, meinen Geist in Bezug auf Ruby freizuschalten. –

Verwandte Themen