处理R语言中的readLines()函数

9

最近我在使用R时遇到了很大的困难。

虽然我不是一个专家用户,但我正在尝试使用R来读取纯文本(.txt)文件并捕获每行。然后,我想处理这些行,并对文本进行一些断点和更改。

以下是我使用的代码:

fileName <- "C:/MyFolder/TEXT_TO_BE_PROCESSED.txt"
con <- file(fileName,open="r")
line <- readLines(con)
close(con)

它可以完美地读取文本和换行符。但我不理解创建的 line 对象是如何工作的。

使用此代码创建的 line 对象具有类:character 和长度:[57]。 如果我键入 line[1],它会显示第一行的文本。但如果我键入

length(line[1])

它返回给我[1]

我想知道如何将这个长度为1的字符串转换成实际包含518的长度为518的字符串。

有人知道我做错了什么吗?

我不一定需要使用readLines()函数。我做了一些研究,也找到了scan()函数,但我最终得到了一个不可变的字符串,长度为518,但是length == 1

希望我对我的问题已经表达清楚了。抱歉我的英语不好。


1
readLines 返回 "一个字符向量,其长度为读取的行数。"(来自 ?readLines)。这就是为什么每行的长度为1。你尝试过使用 read.csvread.table 吗? - Rich Scriven
1
请提供一些数据和您期望的结果。听起来您只需要使用 strsplit 函数即可。 - Rich Scriven
1
尝试使用nchar(line[1]),它将给出列表第一个元素(即文件的第一行)中字符的数量。length(list)告诉你从文件中检索到的行数;通过给它length(list[1]),你正在询问列表的一个切片中元素的数量,这个切片恰好只有一个元素(可能是长度为518或其他值的字符串)。 - r2evans
@r2evans nchar(line[1]) 返回字符串中的字符数。但我想知道如何逐个访问这些字符。strsplit 函数无法满足我的需求。最好的方法是说,我想逐个读取 line 的每一行(即 line[1]line[2]、...、line[n])中的每个字符(空格或非空格),并进行一些重新排列。 - user3521631
如果不清楚您想将字符串分成什么样的部分,我的建议只能是使用 ?substr?regexp - r2evans
3个回答

5
您可以先将代码压缩成一行,另外三行只是创建您不需要的对象。
line <- readLines("C:/MyFolder/TEXT_TO_BE_PROCESSED.txt")

如果您想知道每行有多少个以空格分隔的单词

words <- sapply(line,function(x) length(unlist(strsplit(x,split=" "))))

如果在上述代码中省略了length参数,则会得到每行单词的字符向量列表。

我已经尝试了这些解决方案。如果省略长度参数,它会返回一个名为“words”的列表,其中包含57个元素。如果我键入words [1],它会按单词分割并返回整个第一行。但是,我不能像我想要的那样访问特定的单词,例如:words[1][2]。 - user3521631
1
然后你需要查找[[[之间的区别。要获取第一个列表条目的第一个单词,您需要使用words[[1]][1] - JeremyS

5
假设你使用readLines读取的数据中第一行的文本是txt
如果你想将它分割成单独的字符串,每个字符串都是一个单词,那么可以使用strsplit函数,在每个单词之间的空格处进行拆分。
> txt <- paste0(letters[1:10], LETTERS[1:10], collapse = " ")
> txt
## [1] "aA bB cC dD eE fF gG hH iI jJ"   ## character vector of length 1
> length(txt)
[1] 1
> newTxt <- unlist(strsplit(txt, split = "\\s"))  ## split the string at the spaces
> newTxt
## [1] "aA" "bB" "cC" "dD" "eE" "fF" "gG" "hH" "iI" "jJ"
## now the text is a character vector of length 10  
> length(newTxt)
[1] 10

谢谢,但那不是我需要的。我不想将向量拆分为单词。对我来说,空格非常重要,我希望每个空格也算作一个字符。在您的示例中,我正在寻找的最终产品将是一个29个字符的字符串。 - user3521631
1
好的,那么请使用 split = "" 替代原先的 split = "\\s" - Rich Scriven
@Richard Scriven 提出的解决方案解决了我的问题。我非常感激。更改分割参数是我需要完成它的。 - user3521631

1
怎么样:
con <- file(fileName, open='r')
text <- readLines(con)[[1]]

获取文件的第一行文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接