ใช้ R เพื่อแสดงไฟล์ทั้งหมดที่มีนามสกุลที่ระบุ


139

ฉันใหม่มากสำหรับ R และกำลังดำเนินการอัปเดตสคริปต์ R เพื่อทำซ้ำผ่านชุดตาราง. dbf ที่สร้างโดยใช้ ArcGIS และสร้างชุดของกราฟ

ฉันมีไดเร็กทอรี C: \ Scratch ซึ่งจะมีไฟล์. dbf ทั้งหมดของฉัน อย่างไรก็ตามเมื่อ ArcGIS สร้างตารางเหล่านี้ก็จะมีไฟล์. dbf.xml ด้วย ฉันต้องการลบไฟล์. dbf.xml เหล่านี้ออกจากรายการไฟล์ของฉันและการทำซ้ำของฉัน ฉันได้ลองค้นหาและทดลองใช้นิพจน์ทั่วไปแล้ว แต่ก็ไม่มีประโยชน์ นี่คือนิพจน์พื้นฐานที่ฉันใช้ (ไม่รวมการทดลองต่างๆทั้งหมด):

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

ใครช่วยชี้แนะหน่อยครับ


1
หากคุณกำลังดิ้นรนกับ regexps แต่รู้จักรูปแบบสัญลักษณ์แทนฟังก์ชันglob2rx()มักจะมีประโยชน์
caracal

เป็นแค่ตัวฉันเองหรือชื่อเรื่องทำให้เข้าใจผิด: ควรอ่านว่า "มีเฉพาะนามสกุล" (แต่ฉันหาคำตอบเกี่ยวกับ SO ในการยกเว้นส่วนขยายบางอย่างไม่ได้)
J. Win

caracal ขอบคุณสำหรับคำแนะนำ jonw ฉันคิดว่าฉันสามารถพูดให้กระชับกว่านี้ได้ฉันแค่พยายามโพสต์ก่อนการประชุม
chawkins

มันดึงดูดความสนใจของฉันเพราะเมื่อฉันเรียนรู้เกี่ยวกับ regexp ฉันสงสัยว่ามีวิธีง่ายๆในการยกเว้นหรือไม่ อาจสมควรได้รับคำถามแยกต่างหาก
. วิน.

คำตอบ:


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

$ในตอนท้ายหมายความว่านี่คือจุดสิ้นสุดของสตริง "dbf$"จะใช้งานได้เช่นกัน แต่การเพิ่ม\\.( .เป็นอักขระพิเศษในนิพจน์ทั่วไปดังนั้นคุณต้องหลีกเลี่ยง) ตรวจสอบให้แน่ใจว่าคุณจับคู่เฉพาะไฟล์ที่มีนามสกุล.dbf(ในกรณีที่คุณมี.adbfไฟล์เช่น)


1
กรณีนั้นมีความละเอียดอ่อนหรือไม่?
nsn

6
@nsn ใช่ แต่ถ้าคุณต้องการอย่างอื่นแล้วมีข้อโต้แย้งของฟังก์ชั่นเพื่อignore.case list.files(pattern = "\\.dbf$", ignore.case=TRUE)และดู?list.filesรายละเอียดเพิ่มเติมในหน้าวิธีใช้สำหรับฟังก์ชันนั้น ( )
Marek

62

ลองใช้วิธีนี้ซึ่งใช้ globs แทนนิพจน์ทั่วไปดังนั้นจะเลือกเฉพาะชื่อไฟล์ที่ลงท้ายด้วย .dbf

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

12

ตรึงรูปแบบเพื่อค้นหา"\\.dbf"ที่ส่วนท้ายของสตริงโดยใช้$อักขระ:

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

1
หากจุดหมายถึงจุดจากนามสกุลไฟล์จะใช้ไม่ได้ จุดจับคู่อักขระเดี่ยวในนิพจน์ทั่วไป
Marek

@Marek ก็เพิ่งสังเกตเหมือนกัน ปริมาณคาเฟอีนของฉันต้องลดลงต่ำกว่าเกณฑ์
Gavin Simpson

อืมควรจะเพิ่มว่า\` escape the ตอนนี้ มีใครสงสัยว่าทำไมถึงได้รับการโหวตลดลง?
Gavin Simpson

8

ฉันไม่ค่อยถนัดในการใช้นิพจน์ทั่วไปที่ซับซ้อนดังนั้นฉันจะทำงานดังกล่าวในลักษณะต่อไปนี้:

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

บรรทัดแรกแสดงรายการไฟล์ทั้งหมดจากผบ. อันที่สองลดทุกอย่างที่มี ".xml" (grep ส่งคืนดัชนีของสตริงดังกล่าวในเวกเตอร์ "ไฟล์" การเซตย่อยด้วยดัชนีเชิงลบจะลบรายการที่เกี่ยวข้องออกจากเวกเตอร์) อาร์กิวเมนต์ "คงที่" สำหรับฟังก์ชัน grep เป็นเพียงความตั้งใจของฉันเพราะฉันมักต้องการให้มันจับคู่รูปแบบหยาบโดยไม่ใช้ regexprs แฟนซีสไตล์ Perl ซึ่งอาจทำให้ฉันประหลาดใจ

ฉันทราบดีว่าวิธีแก้ปัญหาดังกล่าวสะท้อนให้เห็นถึงข้อบกพร่องในการศึกษาของฉัน แต่สำหรับมือใหม่อาจมีประโยชน์ =) อย่างน้อยก็ง่าย


1
คุณควรลบเข้าสู่ระบบก่อน- grepฉันต้องการวิธีแก้ปัญหานี้เพื่อแยกไฟล์เฉพาะจากไฟล์ zip ขั้นแรกรับรายชื่อไฟล์ใน data.frame และรับไฟล์เฉพาะและแตกไฟล์ในภายหลัง lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
Sezen

5

ให้รายชื่อไฟล์ที่มีเส้นทางแบบเต็ม:

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

sys.glob สด!
shai
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.