एकल वर्ण स्ट्रिंग के रूप में पाठ फ़ाइल आयात करें


204

आर में एकल चरित्र स्ट्रिंग के रूप में आप एक सादा पाठ फ़ाइल कैसे आयात करते हैं? मुझे लगता है कि इसका बहुत सरल उत्तर होगा, लेकिन जब मैंने आज यह कोशिश की तो मैंने पाया कि मुझे ऐसा करने के लिए कोई फ़ंक्शन नहीं मिला।

उदाहरण के लिए, मान लें कि मेरे पास एक ऐसी फाइल है foo.txtजिसमें मैं टेक्स्टमाइन करना चाहता हूं।

मैंने इसके साथ कोशिश की:

scan("foo.txt", what="character", sep=NULL)

लेकिन यह अभी भी एक वेक्टर वापस आ गया। मुझे कुछ हद तक इसके साथ काम करना पड़ा:

paste(scan("foo.txt", what="character", sep=" "),collapse=" ")

लेकिन यह काफी बदसूरत समाधान है जो शायद अस्थिर भी है।


20
readr::read_fileअब इस समस्या को हल करता है।
जच

जवाबों:


213

यहां @JoshuaUlrich के समाधान का एक प्रकार है जो एक हार्ड-कोडेड आकार के बजाय सही आकार का उपयोग करता है:

fileName <- 'foo.txt'
readChar(fileName, file.info(fileName)$size)

ध्यान दें कि readChar आपके द्वारा निर्दिष्ट बाइट्स की संख्या के लिए स्थान आवंटित readChar(fileName, .Machine$integer.max)करता है , इसलिए अच्छी तरह से काम नहीं करता है ...


18
यह इंगित करने योग्य है कि यह कोड संपीड़ित फ़ाइलों के लिए काम नहीं करेगा। उस स्थिति में, फ़ाइल.info (फ़ाइल नाम) द्वारा दिए गए बाइट्स की संख्या का आकार मेमोरी में पढ़ी जाने वाली वास्तविक सामग्री से मेल नहीं खाएगा, जिसकी हमें बड़ी उम्मीद है।
असीरा

146

यदि कोई व्यक्ति अभी भी 3 साल बाद इस प्रश्न को देख रहा है, तो हैडली विकम के रीड पैकेज में एक आसान read_file()कार्य है जो आपके लिए यह करेगा।

install.packages("readr") # you only need to do this one time on your system
library(readr)
mystring <- read_file("path/to/myfile.txt")

2
काश "read_file" अब स्ट्रिंग में प्रकट नहीं होता है। :( क्रैन.प्रो.प्रो ..org
माइकल लॉयड ली एमएलक

7
@mlk इसे माइग्रेट किया गया है readr। मैंने तदनुसार उत्तर अपडेट किया है - मुझे आशा है कि शेरोन को कोई आपत्ति नहीं है।
निक केनेडी

1
अच्छा! यह भी मक्खी पर .gz फ़ाइलें decompresses
आंद्रे होल्ज़नर

मुझे could not find function "pase"इस कोड पर मिला
Sashko Lykhenko

47

मैं निम्नलिखित का उपयोग करूंगा। यह ठीक काम करना चाहिए, और कम से कम मुझे बुरा नहीं लगता है:

singleString <- paste(readLines("foo.txt"), collapse=" ")

15
मुझे collapse="\n"इस तथ्य को दोहराने की उम्मीद होगी कि ये मूल फ़ाइल पर अलग-अलग लाइनें हैं। इस परिवर्तन के साथ, यह समाधान समान रूप से अच्छी तरह से संपीड़ित और असम्पीडित फ़ाइलों के लिए काम करेगा
असीरा

यह काम नहीं लगता है। मैं writeLines (singleString) है, मैं कोई दूषित फ़ाइल प्राप्त ...
बेढंग आदमी

यह काम नहीं करता है यदि अंतिम पंक्ति में पंक्ति वर्ण का अंत शामिल नहीं है। उस स्थिति में, अंतिम पंक्ति को स्ट्रिंग में शामिल नहीं किया जाता है (वैकल्पिक रूप से, फ़ाइल को अंतिम पंक्ति ब्रेक पर काट दिया जाता है)।
ग्वारोचा

यह पाठ फ़ाइलों को पढ़ने के लिए ठीक काम करेगा जैसा कि ओपी की खोज में है: पाठ फ़ाइल कनेक्शन blocking=TRUEडिफ़ॉल्ट रूप से हैं, इसलिए readLines()लापता ईओएल चरित्र के बारे में चेतावनी के साथ पूरी फ़ाइल वापस कर देगा। हालाँकि @ gvrocha की टिप्पणी मूल्य देने योग्य है: अपने कनेक्शन प्रकार को समझें! रीडलाइन्स कहती हैIf the final line is incomplete (no final EOL marker) the behaviour depends on whether the connection is blocking or not. For a non-blocking text-mode connection the incomplete line is pushed back, silently. **For all other connections the line will be accepted, with a warning.**
क्रैड्स


8

रीडर पैकेज में आपके लिए सब कुछ करने के लिए एक फ़ंक्शन है।

install.packages("readr") # you only need to do this one time on your system
library(readr)
mystring <- read_file("path/to/myfile.txt")

यह संस्करण को पैकेज स्ट्रिंग में बदल देता है।


5

बहुत बुरा है कि शेरोन के समाधान का अब उपयोग नहीं किया जा सकता है। मैंने जोश ओ'ब्रायन के समाधान को asieira के संशोधन के साथ मेरी .Rprofile फ़ाइल में जोड़ा है:

read.text = function(pathname)
{
    return (paste(readLines(pathname), collapse="\n"))
}

और यह इस तरह का उपयोग करें: txt = read.text('path/to/my/file.txt')। मैं बंपकिन (28 अक्टूबर 14) को दोहरा नहीं पाया, और writeLines(txt)सामग्री को दिखाया file.txt। इसके अलावा, write(txt, '/tmp/out')कमांड diff /tmp/out path/to/my/file.txtने कोई अंतर नहीं बताया।


2

readChar में इतना लचीलापन नहीं है इसलिए मैंने आपके समाधान (रीडलाइन और पेस्ट) को संयोजित किया।

मैंने प्रत्येक पंक्ति के बीच एक स्थान भी जोड़ा है:

con <- file("/Users/YourtextFile.txt", "r", blocking = FALSE)
singleString <- readLines(con) # empty
singleString <- paste(singleString, sep = " ", collapse = " ")
close(con)

1

ऐसा लगता है कि आपका समाधान ज्यादा बदसूरत नहीं है। आप फ़ंक्शंस का उपयोग कर सकते हैं और इसे इन तरीकों की तरह प्रोफेशनल बना सकते हैं

  • पहला तरीका
new.function <- function(filename){
  readChar(filename, file.info(filename)$size)
}

new.function('foo.txt')
  • दूसरा तरीका
new.function <- function(){
  filename <- 'foo.txt'
  return (readChar(filename, file.info(filename)$size))
}

new.function()

1
यह @ टॉमी द्वारा प्रदान किए गए उत्तर के लिए कुछ भी नहीं जोड़ता है । फ़ंक्शन वातावरण के भीतर पथ प्रदान करना विशेष रूप से खराब समाधान है।
कोनराड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.