2014-04-29 22 views
16

Come posso ottenere il nome file senza le estensioni? Ad esempio, "test.html.erb" dovrebbe essere "test"Ruby: Ottieni il nome file senza le estensioni

Simile a question. Tuttavia,

> File.basename("test.html.erb", ".*") 
=> "test.html" 

MODIFICA: il codice sopra riportato è il tentativo fallito di produrre il risultato desiderato. Capisco che sto usando File.basename in modo errato. Così, ho postato questa domanda. Quando dico il nome del file senza le estensioni, voglio dire che non mi interessa la roba dopo il primo punto. Il nome che sto cercando di restituire non avrà un punto. Inoltre, nel codice effettivo passerò in __FILE__ anziché "test.html.erb".

+2

beh in questo caso fanno parte del nome file. Un punto è un personaggio perfettamente legittimo da avere in un nome file. – sevenseacat

+0

Posso usare la parola errata "estensioni". Se è così, per favore correggi. Tuttavia, la domanda e l'esito sono legittimi. Sono scioccato nel vedere questo giù votato. – konyak

+1

Sono più scioccato che tu stia codificando da almeno 2 anni (basato sul tuo account SO), abbia> 750 rep, ma non ho letto o capito la documentazione di 'basename', non ho mai sentito parlare di' split', e non conosco altre tecniche di manipolazione delle stringhe (indice + sottostringa, diaframma anche regex) per estrarre la parte prima del primo punto ... – l4mpi

risposta

20

Leggi la documentazione:

basename(file_name [, suffix]) → base_name

Restituisce l'ultimo componente del nome del file data in nome_file, che può essere formato utilizzando sia File :: separatore e file :: ALT_SEPARATOR come il separatore quando File :: ALT_SEPARATOR non è nullo. Se il suffisso viene dato e presente alla fine di nome_file, viene rimosso.

=> File.basename('public/500.html', '.html') 
=> "500" 

in te caso:

=> File.basename("test.html.erb", ".html.erb") 
=> "test" 
+0

Questo in realtà funziona per ciò di cui avevo bisogno dal momento che sto usando '__FILE__' che fornisce il percorso completo del file. – konyak

+0

@ChaseT. '__FILE__' questo è solo un collegamento per il file corrente. –

+0

Quello che intendevo era che "__FILE__" è il percorso completo per il file corrente, quindi non potevo usare l'altra risposta usando solo la divisione. File.basename elimina tutti gli elementi nella parte anteriore e posteriore della stringa per me. – konyak

5

Dividere per punto e la prima parte è quello che desideri.

filename = 'test.html.erb' 
result = filename.split('.')[0] 
+0

Ho dato un upvote per la risposta. Tuttavia, dal momento che sto usando '__FILE__', il metodo File.basename era quello di cui avevo bisogno. – konyak

+0

Finora questa è l'unica soluzione che funziona per i caratteri jolly (indicati nel caso d'uso originale) e per più estensioni. – Hedgehog

0

Grazie a @xdazz e @Monk_Code per le loro idee. Nel caso in cui altri sono alla ricerca, il codice finale che sto utilizzando è:

File.basename(__FILE__, ".*").split('.')[0] 

Supponendo __FILE__ viene utilizzato e non v'è alcun periodo nella stringa risultante, questo permette genericamente di rimuovere il percorso e le estensioni nella parte anteriore e posteriore del file, rispettivamente.

2

Considerando la premessa, la risposta più appropriata per questo caso (e casi simili con altre estensioni) sarebbe qualcosa come questo:

__FILE__.split('.')[0...-1].join('.') 

che rimuoverà solo l'estensione (non le altre parti del nome: myfile.html.erb diventa qui myfile.html, piuttosto che solo myfile

13

Nel caso in cui non si conosce l'estensione è possibile combinare con File.basenameFile.extname:.

filepath = "dir/dir/filename.extension" 
File.basename(filepath, File.extname(filepath)) #=> "filename" 
+6

Questo non funziona nel caso d'uso dato: '.html.erb' – Hedgehog

+2

@Hedgehog hai ragione, ma sono sicuro che la mia soluzione può aiutare un sacco di persone che possono venire qui attratte per il titolo della domanda alla ricerca di un soluzione più generica, come ho fatto io. – fguillen

15

Pathname fornisce una comoda interfaccia orientata agli oggetti per gestire i nomi dei file.

Un metodo consente di sostituire l'estensione esistente con uno nuovo, e che il metodo accetta la stringa vuota come argomento:

>> Pathname('foo.bar').sub_ext '' 
=> #<Pathname:foo> 
>> Pathname('foo.bar.baz').sub_ext '' 
=> #<Pathname:foo.bar> 
>> Pathname('foo').sub_ext '' 
=> #<Pathname:foo> 

questo è un modo conveniente per ottenere il nome del file spogliato della sua estensione, se c'è uno.

Ma se si vuole sbarazzarsi di tutte le estensioni, è possibile utilizzare una regex:

>> "foo.bar.baz".sub(/\..*/, '') 
=> "foo" 
8

ne dite di questo

File.basename(f, File.extname(f))

restituisce il nome del file senza l'estensione .. opere per i nomi di file con più "." dentro.

-1
name = "filename.100.jpg" 
puts "#{name.split('.')[-1]}" 
Problemi correlati