我需要将模型输出文件转换为.csv
格式。原始文件采用.out
格式,并且是由中间的几个空格分隔的数据表:
e.g。原始文件大约有14,000行,但结构是相同的。 请使用此链接获取示例文件: https://www.dropbox.com/sh/1w0f9cq2w6gcbjo/AACoGu6L3yKBGBKODY87lygsa?dl=0
time dayofyr nit_N2O-N dnit_N2O-N dnit_N2-N NO-N CUM-N2O(gN/ha) CUM-NO(gN/ha)
1980.00 1 0.3310 0.3403 0.2022 0.0000 0.6713 0.0000
1980.00 2 0.3295 0.3400 0.2020 0.0000 1.3408 0.0000
1980.00 3 0.3280 0.3397 0.2018 0.0000 2.0086 0.0000
1980.00 4 0.3265 0.3395 0.2016 0.0000 2.6746 0.0000
1980.00 5 0.3251 0.3393 0.2015 0.0000 3.3389 0.0000
1980.00 6 0.3237 0.3391 0.2014 0.0000 4.0017 0.0000
1980.00 7 0.3223 0.3389 0.2013 0.0000 4.6629 0.0000
1980.00 8 0.3209 0.3387 0.2011 0.0000 5.3225 0.0000
1980.00 9 0.3195 0.3386 0.2010 0.0000 5.9805 0.0000
1980.00 10 0.3198 0.4589 0.2868 0.0000 6.7592 0.0000
我已经尝试将扩展名更改为.csv并将连续的空格转换为","但是我担心我会遗漏某些内容,无论是在正则表达式语法中还是在整体原理中
这就是我迄今为止所做的:
# change extension of all .out files:
outFiles <- dir(cntPath, "^.+\\.out", full.names = TRUE, ignore.case = TRUE, all.files = TRUE)
for (nOut in outFiles){
newOut <- gsub('.out', '.csv', outFiles) # rename files to avoid accidental re-processing
file.rename(outFiles, newOut)
}
# for each file, eliminate initial spaces, and replace consecutive spaces with a comma, for all rows and columns.
t1 <- read.csv(paste(cntPath, "test2.csv", sep = "/"), header = TRUE, sep = "\t", blank.lines.skip = FALSE)
for (i in 1:length(nrow(t1))) {
sub("^\\s+", "^\\S", i)
sub("\\s+", ",", i)
}
它应该相对容易,但我迷失了我出错的地方。 任何帮助/建议都会受到鼓舞。 感谢
答案 0 :(得分:1)
首先,在某处备份所有.out
个文件,以便在出现问题时恢复它们。
备份文件后,请在R
。
以下代码块将在.out
中指定的目录中找到fp
个文件,读取它们,将它们写为.csv
,最后删除所有.out
个文件。如果您不想删除文件,请使用unlink
注释最后一行。
编辑:使用tryCatch
块查找读写失败文件
fp <- "." # specify file path
fl <- list.files( path = fp, pattern = "*.out", full.names = TRUE ) # get .out files
for (file in fl ){ # loop through files, read it and write it as .csv files. Then delete .out files
flag <- tryCatch( {
write.table( x = read.table(file = file, header = TRUE ),
file = file.path( fp, gsub( "out$", "csv", basename( file ) ) ),
sep = ",",
row.names = FALSE )
TRUE
},
error = function( x ) {
print( paste0( "Problem reading and writing file : ", file ) )
return(FALSE) } )
if( flag ) unlink( file ) # deletes .out files
}
答案 1 :(得分:1)
您的.out
文件似乎是固定宽度的格式,但有一个小问题,即名称不对齐。
没问题,只需跳过那一行
library(readr)
fwf_txt <- "time dayofyr nit_N2O-N dnit_N2O-N dnit_N2-N NO-N CUM-N2O(gN/ha) CUM-NO(gN/ha)
1980.00 1 0.3310 0.3403 0.2022 0.0000 0.6713 0.0000
1980.00 2 0.3295 0.3400 0.2020 0.0000 1.3408 0.0000
1980.00 3 0.3280 0.3397 0.2018 0.0000 2.0086 0.0000
1980.00 4 0.3265 0.3395 0.2016 0.0000 2.6746 0.0000
1980.00 5 0.3251 0.3393 0.2015 0.0000 3.3389 0.0000
1980.00 6 0.3237 0.3391 0.2014 0.0000 4.0017 0.0000
1980.00 7 0.3223 0.3389 0.2013 0.0000 4.6629 0.0000
1980.00 8 0.3209 0.3387 0.2011 0.0000 5.3225 0.0000
1980.00 9 0.3195 0.3386 0.2010 0.0000 5.9805 0.0000
1980.00 10 0.3198 0.4589 0.2868 0.0000 6.7592 0.0000 "
write_csv(read_fwf(fwf_txt, fwf_empty(fwf_txt, skip = 1),
skip = 1),
path = "fwf.csv",
col_names = FALSE)
由reprex package(v0.2.0)创建于2018-03-25。