如果您对R感到满意,则可以创建基本的data.frame,然后在其上使用fix()函数输入数据。与#5相同,设置data.frame后,您可以使用一系列readLines(n = 1)(或其他方法)来获取数据,对其进行验证,并提供添加下一个数据的机会。行。然后将修复保留为fix()。请参见下面使用scan()的实现示例。
excel中的另一个选项可能比较混乱,但是您可以键入12/9,然后让另一列评估= IFERROR(MONTH(DateEntryCell)/ DAY(DataEntryCell),DataEntryCell)。但是,随后您必须维护excel表和csv表,并且在编写csv时所有的抱怨都会持续存在。
- 另外,只要您的字段相对较短且长度一致,常规文本编辑器就可以很好地为您提供TSV服务。完成后,您始终可以在excel中加载它,并确保每行的列数与期望的一样。
- Emacs在许多平台上都可用,并且可能为此提供了一些功能,例如http://www.emacswiki.org/emacs/CsvMode。
- 如果您是一个热心的人,那么用编程语言快速编程某些东西来进行数据输入是微不足道的,那么数据编辑就会困难得多。
- 谷歌快速搜索显示了仅用于此目的的软件,但是没有免费软件似乎没有什么用。
- 听起来很疯狂,但是超级用户建议在Access中编辑表,然后将它们导出为CSV ...这简直太疯狂了,无法正常工作。
- 保存为.csv并不会阻止excel发出抱怨,但是您可以在数据输入字段之前键入一个单引号,并且就自动格式化而言,它就不用管它了。很好,这(至少在Office 2007中)不会在csv文件中留下撇号。
更新:
我一直在这个问题上反复讨论,因为这也是我的一个问题。到目前为止,到目前为止,我所见过的最好/最简单的数据输入解决方案是KillinkCSV。它不是“免费”软件,而是具有30天试用期和合理价格(约27美元)的共享软件。不过,我不确定我对编辑现有CSV的信任程度如何-我将其交给了一个非常大(且可能格式正确)的CSV,但它无法读取所有行。但是,对于一个相当大的文件(20 MB),它似乎运行良好,并且较大文件的问题可能是我方面的用户错误。
R示例:
#This function takes a what argument like in scan,
#a list with the types to be used, see usage example
#at the end of this code block
#dataEntry will keep reading in values until
#the values it reads in matches what is in
#"terminateon".
#limitations: Many
dataEntry <- function(what,terminateon)
{
CONTINUE <- TRUE #Make sure we start the loop
data <- NULL #Create empty data so that the data.frame can define itself
ti <- NULL
while(CONTINUE)
{
ti <- NULL
ti <- tryCatch(
{as.data.frame(scan(what=what, nlines=1, multi.line=FALSE, comment.char="",quiet=TRUE))},
error=function (e) {print("Error in data entry! Line not stored.")
return(NULL)},
warning=function(w) {print("Error in data entry! Line not stored.")
return(NULL)},
finally={ti <- NULL}
) #Try getting the data according to the parameters in 'what' one row at a time.
if (!is.null(ti))
{
if ((ncol(ti)==length(what)) & (nrow(ti)==1)) {
data <- rbind(data,ti) #If there wasn't an error, add ti to the previous value
} else {
print("Too many or not enough values on previous entry.")
print("Tail of current data:")
print(tail(data))
}
}
if (!is.null(ti) & all(ti == terminateon))
{
CONTINUE <- FALSE
data <- data[-c(nrow(data)),]
} #if we've recieved the final value we won't continue and the last row is invalid so we remove it
}
return(data)
}
dataEntry(list(x=integer(), y=numeric(), z=character()),terminateon=c(999,999,"Z"))