Ich habe eine Methode in einem Ruby-Skript, das versucht, Dateien vor dem Speichern umzubenennen. Es sieht wie folgt aus:Teil eines Strings in Ruby erhöhen
def increment (path)
if path[-3,2] == "_#"
print " Incremented file with that name already exists, renaming\n"
count = path[-1].chr.to_i + 1
return path.chop! << count.to_s
else
print " A file with that name already exists, renaming\n"
return path << "_#1"
end
end
Angenommen, Sie haben drei Dateien mit dem gleichen Namen in einem Verzeichnis gespeichert werden, werden sagen, dass wir die Datei example.mp3
genannt wird. Die Idee ist, dass die erste als example.mp3
gespeichert wird (da es nicht von if File.exists?("#{file_path}.mp3")
an anderer Stelle im Skript abgefangen wird), die zweite wird als example_#1.mp3
gespeichert (da es von der else
Teil der oben genannten Methode gefangen wird) und der 3. als example_#2.mp3
(da es durch den if
Teil der oben genannten Methode gefangen ist).
Das Problem, das ich habe, ist zweifach.
1) if path[-3,2] == "_#"
nicht mit einer ganzen Zahl von mehr als eine Ziffer (example_#11.mp3
beispielsweise für Dateien arbeiten), da die Zeichenplatzierung falsch sein (Sie es brauchen würden path[-4,2]
zu sein, aber dann, die nicht mit nicht zu bewältigen 3-stellige Nummern usw.).
2) Ich erreiche nie das Problem 1), da die Methode Dateinamen nicht zuverlässig abfängt. Im Moment wird das erste in example_#1.mp3
umbenannt, aber das zweite wird in dasselbe umbenannt (wodurch die zuvor gespeicherte Datei überschrieben wird).
Dies ist möglicherweise zu vage für Stack Overflow, aber ich kann nichts finden, das das Problem der Erhöhung eines bestimmten Teils einer Zeichenfolge behandelt.
Vielen Dank im Voraus!
Bearbeiten/Update:
unter Wayne Methode auf seine eigenen zu funktionieren scheint, aber nicht, wenn sie als Teil des gesamten Skript enthält - es einmal eine Datei erhöhen kann (example.mp3
-example_#1.mp3
) aber nicht bewältigen mit example_#1.mp3
und erhöhen es auf example_#2.mp3
. Um ein wenig mehr Kontext zu machen - zur Zeit, wenn das Skript eine Datei zu speichern, findet es den Namen Wayne Methode wie folgt übergeben:
file_name = increment(image_name)
File.open("images/#{file_name}.jpeg", 'w') do |output|
open(image_url) do |input|
output << input.read
end
end
Ich habe Wayne Skript bearbeitet ein wenig so jetzt sieht es wie folgt aus:
def increment (name)
name = name.gsub(/\s{2,}|(http:\/\/)|(www.)/i, '')
if File.exists?("images/#{name}.jpeg")
_, filename, count, extension = *name.match(/(\A.*?)(?:_#(\d+))?(\.[^.]*)?\Z/)
count = (count || '0').to_i + 1
"#{name}_##{count}#{extension}"
else
return name
end
end
Wohin gehe ich falsch? Nochmals vielen Dank im Voraus.
Wir brauchen den Inhalt datei_name kennen zu wissen mit Sicherheit, was schief gelaufen ist, aber sowohl meine Funktion als auch @ Phrog enthalten die Erweiterung (zB '.jpeg') im inkrementierten Dateinamen. Versuchen Sie, '" images/# {file_name} .jpeg "' in '" images/# {file_name} "' zu ändern. Wenn Dateiname auch einen Pfad enthält, können Sie auch 'images /' entfernen, so dass Sie 'File.open (Dateiname, ...)' ' –
' file_name' haben keinen Pfad oder eine Erweiterung. Ich denke, ich habe das Problem jedoch erkannt: Wenn increment läuft 'if File.exists? (" Images/# {name} .jpeg ")' es wird nur nach einer nicht inkrementierten Datei gesucht (zB 'example.jpeg'). Wenn mehr als 2 Dateien mit dem gleichen 'file_name' auftauchen, werden alle nach dem 2. in' example_ # 1.jpeg' geschrieben. Ist das sinnvoll? – Rik
Ich denke, Dateiname muss den Pfad und die Erweiterung von Anfang an enthalten. Das sollte es beheben. Außer dem Variablennamen, der wahrscheinlich 'Pfad' anstelle von' Dateiname' sein sollte, damit der Code die Wahrheit sagt. –