R - 转换< .out>进入< .csv>格式

时间:2018-03-24 20:23:24

标签: r csv export-to-csv

我需要将模型输出文件转换为.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)
}

它应该相对容易,但我迷失了我出错的地方。 任何帮助/建议都会受到鼓舞。 感谢

2 个答案:

答案 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。