读取自由格式输入文件

时间:2017-05-01 14:06:16

标签: r input file-io

我有一个R代码分为多个脚本。代码的结果取决于主脚本中包含的一些参数。脚本不是太长(200行),但仍然不是让参数分散在脚本中,我认为将它们全部放在一个漂亮的输入文件中会更整洁。问题在于,虽然将类似数据帧的文件很容易读入R,即文件中每列都有一种类型,但我不确定如何读取自由格式文件。格式为

类型
var_1 contents of var_1
var_2 contents of var_2
.
.
.

例如:

db_filename  "goofy.csv"
exe_filename "cal_code.exe"
calibration_parameters "Cd" "fn" "fm"
tests "T1" "T2" "T4" "T9"
test_type "V"
speed   2310
flow_rate 2.238

可以按固定顺序指定参数(以便db_filename始终位于第一行)。每个变量可以在任何行中的解决方案,只要它只在 ONE 行中,就会更好,只要这不会使文件不必要地读取代码复杂。什么是强制性的,格式必须是"免费",其中"免费"我的意思是我不想被迫让flow_rate变量(例如)始终在第10列(例如)。我还意味着不是标量的参数长度必须是可变的:例如,calibration_parameterstests是向量,如您所见。文件读取代码必须能够处理3个校准参数,4,5等。 最后,我使用空格来分隔此文件中的元素,但我可以接受使用其他分隔符的解决方案,如果这样可以简化任务。你能帮我看一下这样的文件吗?

1 个答案:

答案 0 :(得分:1)

如果你不介意使用冒号:

db_filename:"goofy.csv"
exe_filename:"cal_code.exe"
calibration_parameters:"Cd" "fn" "fm"
tests:"T1" "T2" "T4" "T9"
test_type:"V"
speed :  2310
flow_rate:2.238

我认为这样的事情对你有用吗?

library(tidyverse)
df = as_tibble( t( read.csv("playing-around.csv", header = FALSE, sep = ":", strip.white = TRUE) %>% tidyr::separate("V2", sep = " ", into = as.character(c(1:10) ) ) ) )
#I used 1:10, but just set it beyond your maximum option list size and this should work
#move the first row to the column names
colnames(df) <- as.character(unlist(df[1,]))
df = tail(df, -1)

然后,您可以访问您的选项集,即字符向量: options = na.omit(df$db_filename)