我正在尝试读取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")
}
}
有些行是空的,并且出现“参数长度为零”错误。如何避免这种情况?
答案 0 :(得分:0)
一个问题是使用length()
而不是nchar()
。由于dataline
是mm_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")
}
}