निर्दिष्ट एक्सटेंशन के साथ सभी फ़ाइलों को सूचीबद्ध करने के लिए R का उपयोग करना


137

मैं R के लिए बहुत नया हूँ और एक R स्क्रिप्ट को अद्यतन करने पर काम कर रहा हूँ। आर्कजीआईएस का उपयोग करके बनाई गई .dbf तालिकाओं की एक श्रृंखला के माध्यम से पुनरावृत्ति करना और ग्राफ़ की एक श्रृंखला का निर्माण करना।

मेरे पास एक निर्देशिका है: C: \ स्क्रैच, जिसमें मेरी सभी .dbf फाइलें होंगी। हालाँकि, जब ArcGIS इन तालिकाओं को बनाता है, तो इसमें एक .dbf.xml फ़ाइल भी शामिल होती है। मैं अपनी फ़ाइल सूची से इन .dbf.xml फ़ाइलों को निकालना चाहता हूं और इस प्रकार मेरी पुनरावृत्ति। मैंने बिना किसी लाभ के नियमित अभिव्यक्ति के साथ खोज और प्रयोग करने की कोशिश की है। यह वह मूल अभिव्यक्ति है जिसका मैं उपयोग कर रहा हूं (सभी विभिन्न प्रयोग को छोड़कर):

files <- list.files(pattern = "dbf")

क्या कोई मुझे कुछ दिशा दे सकता है?


1
यदि आप regexps के साथ संघर्ष कर रहे हैं, लेकिन वाइल्डकार्ड-पैटर्न को जानते हैं, तो फ़ंक्शन glob2rx()अक्सर सहायक होता है।
काराकल

क्या यह सिर्फ मुझे या शीर्षक को भ्रामक है: "केवल एक विशेष एक्सटेंशन के साथ" पढ़ना चाहिए (लेकिन मुझे कुछ एक्सटेंशन को छोड़कर एसओ पर जवाब नहीं मिल सकता है)
जे विन।

caracal, सुझाव के लिए धन्यवाद। jonw, मुझे लगता है कि मैं इसे और अधिक स्पष्ट रूप से कह सकता था, मैं सिर्फ एक बैठक से पहले इसे पोस्ट करने की कोशिश कर रहा था।
चॉकिंस

इसने मेरा ध्यान आकर्षित किया क्योंकि जैसा कि मैंने regexp के बारे में जाना है, मैं सोच रहा था कि क्या कोई आसान तरीका है। शायद एक अलग सवाल के हकदार हैं।
जे विन।

जवाबों:


198
files <- list.files(pattern = "\\.dbf$")

$अंत में इसका मतलब है कि यह स्ट्रिंग का अंत है। "dbf$"भी काम करेगा, लेकिन जोड़ना \\.( .नियमित अभिव्यक्तियों में विशेष चरित्र है ताकि आपको इसे बचने की आवश्यकता हो) यह सुनिश्चित करें कि आप केवल एक्सटेंशन के साथ फाइलों से मेल खाते हैं .dbf(यदि आपके पास .adbfफाइलें हैं)।


1
क्या यह मामला संवेदनशील है?
nsn

6
@nsn हां, लेकिन यदि आप अन्यथा चाहते हैं तो ignore.caseफ़ंक्शन का तर्क है, इसलिए list.files(pattern = "\\.dbf$", ignore.case=TRUE)। और ?list.filesअधिक जानकारी के लिए उस फ़ंक्शन ( ) के लिए सहायता पृष्ठ पर नज़र डालें ।
मारेक

61

इसे आज़माएं जो नियमित अभिव्यक्तियों के बजाय ग्लब्स का उपयोग करता है इसलिए यह केवल उन फ़ाइल नामों को उठाएगा जो अंत में हैं .dbf

filenames <- Sys.glob("*.dbf")

12

चरित्र "\\.dbf"का उपयोग करके स्ट्रिंग के अंत में खोजने के लिए पैटर्न को खूंटी $:

list.files(pattern = "\\.dbf$")

1
यदि डॉट का मतलब फ़ाइल एक्सटेंशन से डॉट है तो यह काम नहीं करेगा। डॉट नियमित अभिव्यक्ति में एकल चरित्र से मेल खाता है।
मारेक

@ मारेक ने बस उस पर भी ध्यान दिया। मेरा कैफीन भंडार एक सीमा से नीचे चला गया होगा।
गैविन सिम्पसन

हम्म को अभी जोड़ा जाना चाहिए \` escape the । तो किसी को आश्चर्य होता है कि यह घट क्यों गया?
गाविन सिम्पसन

8

मैं परिष्कृत नियमित अभिव्यक्तियों का उपयोग करने में बहुत अच्छा नहीं हूं, इसलिए मैं इस तरह के कार्य निम्नलिखित तरीके से करूंगा:

files <- list.files()
dbf.files <- files[-grep(".xml", files, fixed=T)]

पहली पंक्ति में काम करने वाली डायर की सभी फाइलों को सूचीबद्ध किया गया है। दूसरा एक ".xml" युक्त सब कुछ छोड़ देता है (grep 'files' वेक्टर में ऐसे स्ट्रिंग्स के सूचकांकों को लौटाता है; नकारात्मक सूचकांकों के साथ सबसेटिंग वेक्टर से संबंधित प्रविष्टियों को हटा देता है)। grep फ़ंक्शन के लिए "फिक्स्ड" तर्क सिर्फ मेरी इच्छा है, जैसा कि मैं आमतौर पर पर्ल-फैंसी फैंसी रीग्रैक्स के बिना क्रूड पैटर्न से मेल खाना चाहता हूं, जो मेरे लिए आश्चर्य का कारण हो सकता है।

मुझे पता है कि इस तरह के समाधान बस मेरी शिक्षा में कमियां दर्शाते हैं, लेकिन एक नौसिखिए के लिए यह उपयोगी हो सकता है =) कम से कम यह आसान है।


1
आपको -पहले साइन को हटा देना चाहिए grep। मुझे ज़िप फ़ाइल से विशिष्ट फ़ाइलों को निकालने के लिए इस तरह के समाधान की आवश्यकता थी। सबसे पहले, data.frame में फ़ाइल सूची प्राप्त करें और विशिष्ट फ़ाइलें प्राप्त करें और बाद में उन्हें निकालें। lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
सेजेन

5

आपको पूर्ण पथ वाली फ़ाइलों की सूची देता है:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory

लंबे समय तक रहने वाले sys.glob!
शादि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.