将"格式化".txt文件转换为Excel文件



我需要使用 R 将以下.txt文件转换为 excel 文件。 .txt文件的格式如下。手动复制和粘贴转换是不可能的,因为.txt文件由几十个表组成(而且表要大得多(。直接导入也是不可能的,因为用于定义每列的空间不是标准的(有时是两个空格键,有时是三个空格键(。

Table 1:
header                a     b    c    d    e    f    g 
Dates
1.  Sept.23, 1983    1.2   3.2  3.4  5.7  6.2  3.4  4.5
2.  July 26, 1984          4.6  4.8  6.7  4.6  3.4  2.3
3.  April 20, 1985              4.6  4.5  3.6  7.1  9.8
4.  Oct. 22, 1985                    5.6  4.5  6.7  3.3
5.  Jan. 24, 1985                         6.9  3.4  2.3
Table 2:
header
. 
.
.

根据您可以做出的假设(列数、日期后的空格数等(,这可以变得更简单或更难

。中心部分是读取数字字段并用空格填充空列。这里有一个可以使用tidyverse来做到这一点的函数:

library(tidyverse)
fill_left <- function(s, n_fields, col_names){
str_split(s, " +") %>%
map(~ .x[nchar(.x) > 0]) %>%
map(~ c(rep("", n_fields - length(.x)), .x)) %>%
as.data.frame(row.names = col_names) %>%
t() %>%
as_tibble()
}

您可以使用stringr::str_split()通过空格分隔数字(" +"是正则表达式,表示一个或多个空格(。它返回一个列表,因此后续步骤是使用将函数应用于列表的每个元素的purrr::map完成的。

.x[nchar(.x) > 0]:删除空字符串rep("", n_fields - length(.x)):用合适长度的空字符串生成一个向量,使用c()将其与现有数字绑定。您可以将 " 替换为 0。 然后我有几个格式转换来结束一个 tibble,它可能会被简化。

因此,让我们在单个表上使用该函数:

table_content %>%
str_split_fixed("    ", 2) %>%
as_tibble(.name_repair = "universal") %>%
transmute(index = str_split_fixed(...1, "\. ", 2)[,1],
date = str_split_fixed(...1, "\. ", 2)[,2],
fields = ...2) %>%
bind_cols(fill_left(.$fields, 7, letters[1:7])) %>%
select(-fields)

我们从一个表开始,将其拆分为 4 个连续的空格,然后我们可以提取索引(行号(和日期,保留手头的数字字段。我们现在可以将我们的函数应用于数值字段,我们得到一个新的 tibble,我们可以将其与其余部分连接回来。我们最终删除了不再需要的列。

现在,剩下一个问题:第一步是什么。如果我理解您的问题,您有一个包含所有表的文件,您可以使用以下方法一次读取所有内容:

file_content <- readLines("my/file.tab")

然后,您将需要一些编程来剪切表格。您可以使用stringr::str_starts()查找带有标题的行,并对文件内容进行切片:

table_content <- file_content[first_line:last_line]

根据您的文件,您可能还需要收集每个表的列名。

最新更新