【问题标题】:reading configuration from text file从文本文件中读取配置
【发布时间】:2012-12-03 10:27:59
【问题描述】:

我有一个包含条目的 txt 文件

indexUrl=http://192.168.2.105:9200
jarFilePath = /home/soumy/lib

如何从 R 中读取此文件并获取 jarFilePath 的值?

我需要这个来设置 .jaddClassPath()... 由于 windows 和 linux 中的斜杠不同,我无法将 jar 复制到类路径

我想在linux中使用

.jaddClassPath(dir("target/mavenLib", full.names=TRUE ))

但在窗口中

.jaddClassPath(dir("target\\mavenLib", full.names=TRUE ))

所以想从属性文件中读取 jar 的位置!!! 如果还有其他选择,也请告诉我

【问题讨论】:

  • 对于特定于平台的文件路径,您可以查看?file.path
  • 我会尝试使用readlines() 读取整个文本文件或循环读取,一次读取一行。然后使用 whichgrep 查找包含“jarFilePath”的元素(即文本行),然后使用 mypath <- gsub('jarFileaPath = ','',the_text_line)

标签: r rjava


【解决方案1】:

截至 2016 年 9 月,CRAN 拥有包 properties

它正确处理属性值中的=(但不处理第一个= 符号后的空格)。

例子:

属性文件/tmp/my.properties的内容:

host=123.22.22.1
port=798
user=someone
pass=a=b

R 代码:

install.packages("properties")
library(properties)

myProps <- read.properties("/tmp/my.properties")

然后就可以访问myProps$host等属性了,特别是myProps$passa=b,符合预期。

【讨论】:

    【解决方案2】:

    我不知道一个包是否提供了特定的接口。

    如果没有,我会先使用 read.table 将数据加载到数据框中:

    myProp <- read.table("path/to/file/filename.txt, header=FALSE, sep="=", row.names=1, strip.white=TRUE, na.strings="NA", stringsAsFactors=FALSE)
    

    sep="=" 显然是分隔符,这将很好地分隔您的属性名称和值。

    row.names=1 表示第一列包含您的行名,因此您可以通过这种方式索引您的数据属性以检索您想要的每个属性。 例如:myProp["jarFilePath", 2] 将返回 "/home/soumy/lib"

    strip.white=TRUE 将去除您可能不关心的前导和尾随空格。

    可以方便地将加载的数据帧转换为命名向量,以便以更简洁的方式检索属性值:myPropVec &lt;- setNames(myProp[[2]], myProp[[1]])

    然后从名称中检索属性值:myPropVec["jarFilePath"] 也将返回 "/home/soumy/lib"

    【讨论】:

    • 顺便说一句,访问属性的更简洁的结构是将数据框转换为命名向量。类似:myProp &lt;- setNames(myProp[[2]], myProp[[1]])。因此访问属性变为:myProp["jarFilePath"].
    • 上一条评论中对setNames的调用应该是myProp &lt;- setNames(myProp[,1],row.names(myProp))
    • 在帖子中,myProp[[2]] 不会像它所写的那样存在,所以我认为myProp[[2]]["jarFilePath"] 应该是,例如myProp["jarFilePath",1]
    • @Rahul 是的Rahul,很好的捕捉,作为数据框,访问属性的方式不正确,我要改一下:应该是myProp["jarFilePath", 2] - - 注意“2”,而不是“1”,因为“1”是属性名称,“2”是属性值。但是,如果将读取的数据帧转换为向量,我相信 setNames 在我发布时是正确的,并提供了一种更简洁的方法来检索属性值。 myPropVec
    • 我试过了,我认为我在 cmets 中给出的版本是正确的。原因是因为您在调用read.table 中有row.names=1,所以返回的data.frame 只有一列。
    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2012-12-23
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    相关资源
    最近更新 更多