逐行读取时,参数长度为零

时间:2018-12-16 08:45:00

标签: r

我正在尝试读取txt文件R并进行解析。

代码如下:

con <- file(inputFileName,"r")
mm_data<- readLines(con,warn = FALSE)
for (i in 1:length(mm_data)){
    dataline = mm_data[i]
    if(length(dataline) & grep("PACKAGE",dataline) & grep("PACKAGE REQUIREMENT", dataline))
    {
        print("Hello")
    }
}

有些行是空的,并且出现“参数长度为零”错误。如何避免这种情况?

1 个答案:

答案 0 :(得分:0)

一个问题是使用length()而不是nchar()。由于datalinemm_data的元素,因此长度始终为1。要计算其中的字符数,请改用nchar()

另一个问题是使用grep()。它将返回匹配的索引,而不是逻辑值。如果您的行与模式不匹配,它将返回长度为零的向量,这就是为什么会看到错误的原因。如果要得到合乎逻辑的结果,请使用grepl()

第三个问题是您永远不会关闭连接。这不会导致错误,但是如果此代码处于循环中,则可能会导致连接用尽,或者由于某些其他原因而导致运行过多。

最后一个问题是有点晦涩:如果您碰巧读取的文件中没有行,那么length(mm_data)最终将变成0。您的循环仍将运行 通过两个步骤,因为1:0就像c(1, 0)

这不是问题,但是效率低下:如果您的行与模式"PACKAGE REQUIREMENT"相匹配,那么它也将与模式"PACKAGE"相匹配,并且不会是空白行。因此,您在测试中实际上只需要一个grepl()

包含所有这些建议的代码版本为:

mm_data<- readLines(inputFileName, warn = FALSE)
for (i in seq_along(mm_data)){
    dataline <- mm_data[i]
    if(grepl("PACKAGE REQUIREMENT", dataline))
    {
        print("Hello")
    }
}