【发布时间】:2017-09-18 20:05:25
【问题描述】:
我需要将一个包含大约 9 列和 9,000 多行的大型 .csv 文件拆分为每行单独的 .txt 文件,并以第一列中的名称命名每个新生成的文件。
例如 对于 .csv 文件:
01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8
01001_r2 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.46 8
01001_r3 32.4327 -86.6190 0.80 0.15 0.05 1.33 5.23 10
01003_r1 30.4887 -87.6918 0.65 0.20 0.15 1.33 5.23 9
01003_r2 30.4887 -87.6918 0.80 0.15 0.05 1.33 5.25 9
01003_r3 30.4887 -87.6918 0.65 0.20 0.15 1.33 4.96 8
我最终会得到 6 个文件,每个文件一行。
输出文件中的列需要“制表符分隔”,并且文件不得包含行名或列名。
例如,输出文件应如下所示:
01001_r1 32.4327 -86.6190 0.65 0.20 0.15 1.33 5.47 8
这就是我走到这一步的地方:
#set 'working directory'
setwd('C:/Users/Data/soils_data/sitesoil_in')
#identify data frame from .csv file
sd <- read.csv('site_soil.csv', sep="\t", header=F, fill=F)
lapply(1:nrow(sd), function(i) write.csv(sd[i,],
file = paste0(sd[i,1], ".txt"),
row.names = F, header = F,
quote = F))
这是我为每个输出文件得到的:
文件名:01001_r1
V1,V2,V3,V4,V5,V6,V7,V8,V9
01001_r1,32.4327,-86.619,0.65,0.2,0.15,1.33,5.47,8
我无法消除列名或用制表符分隔列。 我尝试使用 header = F 或 col.names = F 来消除标题,并尝试使用 sep = "\t" 来分隔列,但它无法识别命令。
如果有任何帮助,我将不胜感激。 谢谢, E.
根据所有建议,这是可以解决问题的更简单的代码:
#set 'working directory'
setwd('C:/Users/Elena/Desktop/DayCent_muvp_MODEL/DayCent_SourceData/soils_data/sitesoil_in')
#identify data frame from .csv file
sd <- read.csv('site_soil.csv', sep="\t", header=F, fill=F)
lapply(1:nrow(sd),
function(i) write.table(sd[i,],
file = paste0(sd[i,1], ".txt",collapse = ""),
row.names = FALSE, col.names = FALSE,
sep = "\t"
))
感谢大家的帮助。 E.
【问题讨论】:
-
检查 write.table - 您的方法将其再次保存为 .csv,这在您的情况下是不可取的。你能解释一下这个仅仅有用的拆分成数千个 .txt 文件的目的背后的意图吗?
-
谢谢 Christian,我试过了,但是如果我使用 write.table 而不是 write.csv,它会给我一个错误......这些是另一个代码生成模型文件的输入文件输入。后面的代码要求这些文件采用非常特定的格式才能识别信息。
-
您将需要调查当时给出的错误。
write.csv是write.table的包装器,如文档 (?write.table) 所述,并不打算变得灵活。根据我的经验,使用write.table并手动指定所需的正确参数几乎总是更好,而不是使用write.csv并希望它的参数是你需要的。 -
谢谢user5359531,我会按照你的建议检查参数,看看能不能找到错误的根源。