如何在不更改间距或列的情况下导入和重新导出文本文件?
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(" ", " "," "," ", " ", " ","")
并使用 mapply
和 paste0
将这些空格添加到每列的末尾(这适用于 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)))
我有一个文件 (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(" ", " "," "," ", " ", " ","")
并使用 mapply
和 paste0
将这些空格添加到每列的末尾(这适用于 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)))