2016-04-04 9 views
0

Hier ist mein CodeGibt es eine elegantere Art der Teilzeichenfolge?

file_name = Dir['path/xml/test/*.txt'] 
file_name.to_s # => ["path/xml/test/test.txt"] 

ich zurückkehren wollen:

"test" 

ich es mit dem Code unten tun können:

file_name = Dir['path/xml/test/*.txt'] 
file_name.to_s[15,60].gsub(/.txt["]/,"").gsub(/]/,"") 

Aber es ist nicht sehr elegant. Gibt es eine elegantere Möglichkeit, den Dateinamen einfach ohne .txt und [] zurückzugeben?

+0

Seit 'Dir []' Sie ein Array ist zu geben, Sie sollten es nicht auf eine Zeichenfolge umwandeln. Rufen Sie stattdessen '.first' oder vielleicht' .pop' darauf auf (oder viele andere Möglichkeiten, auf das Array-Element zuzugreifen, um das erste Element zu erhalten, dann können Sie [diese Vorschläge mit 'File.basename () '] (http://stackoverflow.com/questions/374326/how-to-get-filename-without-extension-from-file-path-in-ruby), um den gewünschten Teil des Dateinamens zu erhalten. –

+0

Erwarten Sie, dass Ihr 'Dir []' mehrere Dateien zurückgibt? Wenn ja, willst du die Namen von allen bekommen? –

+0

Ja Ich möchte mehrere Namen zurückgeben, damit ich den Dateinamen mit einem Element in einem XML-Code vergleichen kann. – Lewis909

Antwort

5

Ja.

File.basename(Dir['path/xml/test/*.txt'].first, ".txt") 
# => "test" 

Um es für alle Dateien zu tun,

Dir['path/xml/test/*.txt'].map{|e| File.basename(e, ".txt")} 
+0

Wie würde ich das für alle Dateien im Array tun? – Lewis909

0

auch möglich, falls weitere Dateien ...

Dir[ 'path/name/*.txt' ].map { | e | 
    File.basename(e).split(".").first 
} 
+0

Es ist bereits bekannt, dass sie alle '.txt' sind, so dass Sie den Split vermeiden können, wenn Sie nur' File.basename (e, '.txt') ' –

+0

@MichaelBerkowski verwenden. Das stimmt, aber ich möchte gerne auf die Teile zugreifen eine Zeichenfolge mit 'first' und' last' – devanand

Verwandte Themen