如何在不更改间距或列的情况下导入和重新导出文本文件?

How can I import and re-export a text file without changing the spacing or columns?

我有一个文件 (prf003.tre) 从一些旧的专有软件生成,我正试图在 R 中编辑。 它的结构如下:

0001  116.00 1BF 19.2     0.0             5500        0           
0001  216.00 1BF 19.2     0.0             5500        0           
0001  316.00 1BF 19.2     0.0             5500        0           
0001  416.00 1BF 19.2     0.0             5500        0           
0001  516.00 1BF 19.2     0.0             5500        0           
0001  616.00 1BF 19.2     0.0             5500        0           
0001  716.00 1BF 19.2     0.0             5500        0           

目标是能够导入文件,将第2列的值修改为读取

prf003[, 2]<- seq.int(nrow(prf003))

然后重新导出文件。

(每个单元格之间大约有 10-20 个空格,具体取决于哪一列。不幸的是,将其复制到 Whosebug 中不会使其以这种方式显示,所以我将其粘贴为代码,希望没问题,对不起,我是新手。我需要保持间距的完整性。)

我尝试导入 R,同时尝试 read.table 和 readLines。 read.table 不保留间距,但是我无法使用 readLines 修改第 2 列,因为它将它作为一列读取。有什么建议么?也许 read.table 中有一个我不知道的设置,但搜索没有找到任何结果。

编辑:read.Table 还在我的第一列中删除了 0,有关如何保留“0001”的任何提示都会有所帮助。

为了在列上使用 R 函数,我们需要先转换为数据框。这意味着我们将需要在最后重建源文件间距。

首先,我们将阅读 colClasses = 'character' 以保留前导零:

prf003 <- read.table(data, colClasses = "character")

prf003[, 2] <- seq.int(nrow(prf003))

现在,我们将为列间距定义一个向量(注意,我们需要在最后一个空元素,因为最后一列之后没有空格):

spacing <-  c("  ", " ","   ","     ", "             ", "        ","")

并使用 mapplypaste0 将这些空格添加到每列的末尾(这适用于 paste0(prf003[ ,1], spacing[[1]])paste0(prf003[ ,2], spacing[[2]]) 等:

formatted_prf <- mapply(paste0, prf003, spacing) 

然后我们可以使用 write.table

写回您的原始文件格式
write.table(formatted_prf, "new_prf.tre", sep = "", quote = FALSE, 
  col.names = FALSE, row.names = FALSE)

注意 sep 必须为空,quote = FALSE 以免搞砸我们的间距。

这是write.table的输出:

0001  1 1BF   19.2     0.0             5500        0
0001  2 1BF   19.2     0.0             5500        0
0001  3 1BF   19.2     0.0             5500        0
0001  4 1BF   19.2     0.0             5500        0
0001  5 1BF   19.2     0.0             5500        0
0001  6 1BF   19.2     0.0             5500        0
0001  7 1BF   19.2     0.0             5500        0

假设我们使用 readLines 读入字符向量 L,如末尾注释所示。然后假设您希望第 2 列的替换在小数点后也有 2 位数字:

substr(L, 7, 12) <- sprintf("%6.2f", seq_along(L))
writeLines(L, stdout()) # replace stdout() with "myfile.dat", say

给予:

0001    1.00 1BF 19.2     0.0             5500        0
0001    2.00 1BF 19.2     0.0             5500        0
0001    3.00 1BF 19.2     0.0             5500        0
0001    4.00 1BF 19.2     0.0             5500        0
0001    5.00 1BF 19.2     0.0             5500        0
0001    6.00 1BF 19.2     0.0             5500        0
0001    7.00 1BF 19.2     0.0             5500        0

备注

Lines <- "0001  116.00 1BF 19.2     0.0             5500        0           
0001  216.00 1BF 19.2     0.0             5500        0           
0001  316.00 1BF 19.2     0.0             5500        0           
0001  416.00 1BF 19.2     0.0             5500        0           
0001  516.00 1BF 19.2     0.0             5500        0           
0001  616.00 1BF 19.2     0.0             5500        0           
0001  716.00 1BF 19.2     0.0             5500        0"
L <- trimws(readLines(textConnection(Lines)))