2016-04-04 4 views
0

Вот мой кодЕсть ли более элегантный способ подстроки?

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

Я хочу вернуться:

"test" 

я могу сделать это с кодом ниже:

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

Но это не очень элегантно. Есть ли более элегантный способ просто вернуть имя файла без .txt и []?

+0

Поскольку 'Dir []' дает вам массив, вы не должны передавать его в строку. Вместо этого вызовите '.first' или, может быть,' .pop' на него (или многие другие возможности для доступа к элементу массива в зависимости от ваших потребностей), чтобы получить первый элемент, тогда вы можете использовать [эти предложения с помощью 'File.basename () '] (http://stackoverflow.com/questions/374326/how-to-get-filename-without-extension-from-file-path-in-ruby) для получения части нужного имени файла. –

+0

Ожидаете ли вы, что ваш 'Dir []' вернет несколько файлов? Если да, вы хотите получить имена всех из них? –

+0

Да, я хочу вернуть несколько имен, чтобы я мог сопоставить имя файла с элементом в xml. – Lewis909

ответ

5

Да.

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

Чтобы сделать это для всех файлов,

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

Как я могу сделать это для всех файлов в массиве? – Lewis909

0

Также возможно в случае, если есть несколько файлов ...

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

Уже известно, что все они '.txt', поэтому вы можете избежать разделения, если просто используете' File.basename (e, '.txt') ' –

+0

@MichaelBerkowski Это правда, но мне нравится обращаться к частям строка с 'first' и' last' – devanand

Смежные вопросы