2013-02-25 7 views
16

मेरे पास डेटा.फ्रेम है जिसमें फ़ाइल नामों का टेक्स्ट कॉलम है। मैं पथ या फ़ाइल एक्सटेंशन के बिना फ़ाइल नाम वापस करना चाहता हूं। आम तौर पर, मेरे फ़ाइल नाम गिने गए हैं, लेकिन उन्हें होना जरूरी नहीं है। उदाहरण के लिए:रेगेक्स रिटर्न फ़ाइल का नाम, पथ और फ़ाइल एक्सटेंशन को हटाएं

df<-data.frame(data=c("a","b"),fileNames=c("C:/a/bb/ccc/NAME1.ext","C:/a/bb/ccc/d D2/name2.ext")) 

मैं

df<-data.frame(data=c("a","b"),fileNames=c("NAME","name")) 

के बराबर वापस जाने के लिए चाहते हैं, लेकिन मैं gsub के साथ ऐसा करने चालाक नियमित अभिव्यक्ति को समझ नहीं सकता। उदाहरण के लिए, मैं के साथ विस्तार से छुटकारा मिल सकता है (फ़ाइल नाम प्रदान की एक संख्या के साथ समाप्त होता है):

gsub('([0-9]).ext','',df[,"fileNames"]) 

हालांकि मैं विभिन्न पैटर्न की कोशिश कर रहा है (इस साइट पर regex मदद फ़ाइलों और इसी तरह के समाधान को पढ़ कर), मुझे पिछले "/" और पहले "।" के बीच पाठ को वापस करने के लिए रेगेक्स नहीं मिल सकता है। समान प्रश्नों के लिए कोई विचार या आगे बहुत सराहना की जाती है!

सबसे अच्छा मैं मिल गया है है:

gsub('*[[:graph:]_]/|*[[:graph:]_].ext','',df[,"fileNames"]) 

लेकिन इस 1) सभी प्रमुख मार्ग पात्रों से छुटकारा पाने के नहीं है और 2) एक विशिष्ट फ़ाइल एक्सटेंशन पर निर्भर है।

उत्तर

33

शायद यह है कि आप अपने समाधान के करीब मिल जाएगा:

library(tools) 
basename(file_path_sans_ext(df$fileNames)) 
# [1] "NAME1" "name2" 

file_path_sans_ext समारोह (जो मेरा मानना ​​है कि आम तौर पर आर के साथ आता है) "उपकरण" पैकेज से है, और उस के लिए पथ ऊपर निकाल देंगे (लेकिन शामिल नहीं) एक्सटेंशन। basename फ़ंक्शन तब आपकी पथ जानकारी से छुटकारा पायेगा।

या, file_path_sans_ext से लेने के लिए और यह थोड़ा संशोधित करने के लिए, आप की कोशिश कर सकते हैं:

sub("(.*\\/)([^.]+)(\\.[[:alnum:]]+$)", "\\2", df$fileNames) 
# [1] "NAME1" "name2" 

यहाँ, मैं "कब्जा कर लिया" है "फ़ाइल नाम" चर के सभी तीन भागों, इसलिए यदि आप बस चाहता था फ़ाइल पथ, आप "\\2" से "\\1" बदल देंगे, और यदि आप केवल फ़ाइल एक्सटेंशन चाहते थे, तो आप इसे "\\3" पर बदल देंगे।

+0

दिलचस्प दृष्टिकोण। मेरे लिए, यह दृष्टिकोण रेगेक्स से अधिक स्पष्ट है, जो वर्तमान में मेरे लिए भ्रमित है। मै उसे करने की एक कोशिश तो करूंगा। – Docuemada

+0

यह अच्छी तरह से काम किया, धन्यवाद। यह मेरे लिए अधिक समझ में आता है, लेकिन शायद यह है क्योंकि मुझे रेगेक्स के साथ और अधिक अभ्यास की ज़रूरत है! – Docuemada

+0

@ डोकुमेडा, कोई समस्या नहीं। जैसा कि दिखाया गया है, 'file_path_sans_ext' एक मूल नियमित अभिव्यक्ति है, क्योंकि मुझे संदेह है कि' बेसनाम 'है (लेकिन सत्यापित करने के लिए जांच नहीं की गई है)। – A5C1D2H2I1M1N2O1R2T1

9

सबसे पहले, "अग्रणी पथ" से छुटकारा पाने के लिए, आप basename का उपयोग कर सकते हैं। एक्सटेंशन को निकालने के लिए, आप अपने सवाल में sub समान का उपयोग अपने विवरण के लिए कर सकते हैं:

filenames <- sub("\\.[[:alnum:]]+$", "", basename(as.character(df$fileNames))) 

ध्यान दें कि आप gsub यहाँ के बजाय sub का उपयोग करना चाहिए, क्योंकि फाइल एक्सटेंशन केवल प्रत्येक फ़ाइल नाम के लिए एक बार हो सकता है। साथ ही, आपको \\. का उपयोग करना चाहिए जो . के बजाय किसी डॉट से मेल खाता है जो किसी भी प्रतीक से मेल खाता है। अंत में, आपको यह सुनिश्चित करने के लिए $ पैटर्न में जोड़ना चाहिए ताकि आप यह सुनिश्चित कर सकें कि आप एक्सटेंशन को केवल तभी हटा रहे हैं जब यह फ़ाइल नाम के अंत में है।

संपादित करें: समारोह file_path_sans_ext आनंद महतो के समाधान में सुझाव दिया sub("([^.]+)\\.[[:alnum:]]+$", "\\1", x), अर्थात के बजाय ऊपर के रूप में विस्तार को दूर करने के माध्यम से काम करता है, फ़ाइल नाम के गैर विस्तार हिस्सा बनी रहती है। मैं ओपी के मामले में दोनों विधियों दोनों के किसी भी विशिष्ट फायदे या नुकसान नहीं देख सकता।

+1

आपको संभवतः 'डी.एफ़ $ फ़ाइल नाम' के आसपास 'as.character' का उपयोग करने की आवश्यकता है, यदि इसे एक कारक के रूप में पढ़ा गया है, जैसा कि प्रदान किए गए उदाहरण डेटा में है। – A5C1D2H2I1M1N2O1R2T1

+0

@ अन्नंदा संपादित, धन्यवाद। – QkuCeHBH

+0

धन्यवाद, और regexp वर्णों को समझाने के लिए धन्यवाद। यह अच्छी तरह से काम करता है। इस उदाहरण के लिए, मैंने ... as.character (df $ fileNames) का उपयोग किया। – Docuemada

संबंधित मुद्दे