# Ruby: Suche durch Datein



## Gossi (25. Nov 2011)

Hiho, ich habe ein Problem mit Ruby:

Ich möchte alle Datein im Verzeichnis die mit *.mas.use.txt enden mit allen Datein die mit *.rez.txt enden vergleichen.

Wenn eine Spalte aus den *.rez.txt-Datein in der .mas.use.txt Datei vorhanden ist, soll sie ausgegeben werden, habs nu so geschrieben (im Kommentar steht mein alter Versuch ^^)


```
Dir['*.mas.use.txt'].each do |d|
  next unless File.file?(d)
  @data = File.read(d)
  Dir['*.rez.txt'].each do |re|
    next unless File.file?(re)
    @rezept = File.readlines(re)
  end
  for rez in @rezept
    if @data.include? rez
      puts rez
    end
  end
#  for @dat in @data
#    for @rez in @rezept
#      @rez = @rez.delete ","
#      if @dat != nil
#        if @dat.include? @rez
#          puts "Found: " + @dat
#        end
#      end
#    end
#  end
end
```

Nun gibt er aber immer nur eine Zeile aus, wenn sie sowohl in der .mas, alsauch in der .rez Datei ganz am ende steht, ich hab echt keine Ideen mehr woran das liegt :bahnhof:


----------



## schalentier (25. Nov 2011)

File.read liest ein File komplett ein und liefert einen String zurueck (mit \n drin).
File.readlines liest ein File komplett ein und liefert ein Array mit den einzelnen Zeilen zurueck.

Zudem ist das mit dem inneren Loop so wahrscheinlich nicht korrekt. In deiner aktuellen Implementierung wird immer nur mit dem letzten gefundene *.rez.txt verglichen.


----------



## Gossi (27. Nov 2011)

schalentier hat gesagt.:


> File.read liest ein File komplett ein und liefert einen String zurueck (mit \n drin).
> File.readlines liest ein File komplett ein und liefert ein Array mit den einzelnen Zeilen zurueck.
> 
> Zudem ist das mit dem inneren Loop so wahrscheinlich nicht korrekt. In deiner aktuellen Implementierung wird immer nur mit dem letzten gefundene *.rez.txt verglichen.



Danke, werd mir das ganze morgen nochmal genauer anschauen


----------



## Gossi (28. Nov 2011)

Habs nu so versucht:


```
Dir['*.mas.use.txt'].each do |d|
  next unless File.file?(d)
  @data = File.readlines(d)
  for dat in @data
    Dir['*.rez.txt'].each do |re|
      next unless File.file?(re)
      @rezept = File.readlines(re)
      for rez in @rezept
        if dat.include? rez
          puts rez
        end
      end
    end 
  end
end
```

Läuft aber immernoch net -.-
[edit]
Hatte vergessen, dass die Zeilen die verglichen werden ein "," beinhalten....

```
Dir['*.mas.use.txt'].each do |d|
  next unless File.file?(d)
  @data = File.readlines(d)
  for @dat in @data
    if @dat == nil
      puts @dat + " is nil"  
    else
      Dir['*.rez.txt'].each do |re|
        next unless File.file?(re)
        @rezept = File.readlines(re)
        for @rez in @rezept
          if @rez != nil     
            @rez = @rez[0,8];
            if @dat.include? @rez
              puts "found: " + @rez + " in " + @dat
            end
          end
        end
      end 
    end
  end
end
```
[/edit]


----------



## Gossi (28. Nov 2011)

-.- Zu spät zum ernueten Editieren, aber wens interessiert, hier nochmal ne Variante die nicht das komplette Dir durchsucht:


```
#Einlesen der .mas Datei
puts "Bitte geben sie die mas.use.txt an (ohne Dateiendung)"
@mas_datei = gets
@mas_datei = @mas_datei.chomp + ".mas.use.txt"
puts
#Einlesen der Rezeptdatei
puts "Bitte geben sie die Rezeptdatei an (mit Dateiendung)"
@rez_datei = gets
@rez_datei = @rez_datei.chomp
puts

#Oeffnen der mas Datei
@data = File.readlines(@mas_datei)
#Durchlaufen der einzelnen Zeilen
for @dat in @data
  #Auf nil Pruefen
  if @dat == nil
    puts @dat + " is nil" 
  else 
    #Oeffnen der Rezeptdatei
    @rezept = File.readlines(@rez_datei)
    #Durchlaufen der Zeilen
    for @rez in @rezept
      #Pruefung auf nil
      if @rez != nil   
        #Ausschneiden des benoetigten Abschnitts  
        @rez = @rez[0,8];
        #Pruefung ob die Datensaetze uebereinstimmen, dann Ausgeben
        if @dat.include? @rez
          puts @rez
        end
      end
    end
  end
end

#Verhindert beim Starten mit Konsole das Schliessen des Fensters
puts
puts "Zum Beenden bitte Enter druecken"
gets
```


----------

