打开包含 table 且没有明确分隔符的文本文件
Open a text file containing a table with no clear separator
我必须打开一个文本文件,其中包含我想作为 tibble 或数据框打开的数据。数据存储在一个表中,以白色 space 作为分隔符(我想)。问题是 whitespace 也用于“PI”列。我不知道如何在不执行任何复杂的脚本来扫描所有内容并使用正则表达式解析它的情况下打开它。
你有什么建议吗 ?我认为当我们将它作为文本文件打开时,它的设计目的是让列在视觉上对齐。
这是该文件的示例。
DAC PI SPROF_DATE_UPDATE DATA_MODE WMO CYCLE PROFILE_DATE LON LAT MPD_RAW MPD_ADJ Z_RAW Z_ADJ
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 18:52:52 R 5903612 038 2012-07-04 01:15:50 8.651 -41.466 -89.313473 NaN 5.439052 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2020-12-03 02:03:33 R 5903717 138 2014-02-03 18:07:45 -164.533 -69.958 134.866767 NaN 7.884637 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 22:44:39 R 5903717 139 2014-02-10 20:05:49 -164.302 -70.061 99.848464 NaN 5.803396 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 22:44:53 R 5903717 140 2014-02-17 22:06:53 -164.146 -70.246 107.535752 NaN 6.260275 NaN
- 以文本行的形式读取文件
- 用自定义且唯一的分隔符替换多个连续空格
- 将所有内容粘贴到字符向量中
- 使用自定义分隔符读取该数据
- 额外的re-formatting,例如修剪和类型转换
library(tidyverse)
read_lines("data.txt") %>%
map_chr(~ .x %>% str_replace_all("( )+", ";")) %>%
paste0(collapse = "\n") %>%
read_delim(delim = ";", col_types = cols(.default = "character")) %>%
mutate(across(everything(), str_trim)) %>%
type_convert()
修复@danlooo
第一:header 分隔符是单个 space.
第二:有时在 -
之前只有一个 space
data = readLines("testdata.txt")
data[1] = gsub(pattern ="\s+" ,replacement = "\t" ,x = data[1])
modified_data = gsub(pattern ="\s-" ,replacement = " -" ,x = data)
modified_data = gsub(pattern ="\s{2,}" ,replacement = "\t" ,x = modified_data)
final_data = paste0(modified_data,collapse = "\n")
write(final_data, "finaldata.txt")
finaldatatable <- read_delim("finaldata.txt",
delim = "\t", escape_double = FALSE,
trim_ws = TRUE)
我必须打开一个文本文件,其中包含我想作为 tibble 或数据框打开的数据。数据存储在一个表中,以白色 space 作为分隔符(我想)。问题是 whitespace 也用于“PI”列。我不知道如何在不执行任何复杂的脚本来扫描所有内容并使用正则表达式解析它的情况下打开它。 你有什么建议吗 ?我认为当我们将它作为文本文件打开时,它的设计目的是让列在视觉上对齐。
这是该文件的示例。
DAC PI SPROF_DATE_UPDATE DATA_MODE WMO CYCLE PROFILE_DATE LON LAT MPD_RAW MPD_ADJ Z_RAW Z_ADJ
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 18:52:52 R 5903612 038 2012-07-04 01:15:50 8.651 -41.466 -89.313473 NaN 5.439052 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2020-12-03 02:03:33 R 5903717 138 2014-02-03 18:07:45 -164.533 -69.958 134.866767 NaN 7.884637 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 22:44:39 R 5903717 139 2014-02-10 20:05:49 -164.302 -70.061 99.848464 NaN 5.803396 NaN
aoml STEPHEN RISER , KENNETH JOHNSON 2021-05-12 22:44:53 R 5903717 140 2014-02-17 22:06:53 -164.146 -70.246 107.535752 NaN 6.260275 NaN
- 以文本行的形式读取文件
- 用自定义且唯一的分隔符替换多个连续空格
- 将所有内容粘贴到字符向量中
- 使用自定义分隔符读取该数据
- 额外的re-formatting,例如修剪和类型转换
library(tidyverse)
read_lines("data.txt") %>%
map_chr(~ .x %>% str_replace_all("( )+", ";")) %>%
paste0(collapse = "\n") %>%
read_delim(delim = ";", col_types = cols(.default = "character")) %>%
mutate(across(everything(), str_trim)) %>%
type_convert()
修复@danlooo
第一:header 分隔符是单个 space.
第二:有时在 -
之前只有一个 space
data = readLines("testdata.txt")
data[1] = gsub(pattern ="\s+" ,replacement = "\t" ,x = data[1])
modified_data = gsub(pattern ="\s-" ,replacement = " -" ,x = data)
modified_data = gsub(pattern ="\s{2,}" ,replacement = "\t" ,x = modified_data)
final_data = paste0(modified_data,collapse = "\n")
write(final_data, "finaldata.txt")
finaldatatable <- read_delim("finaldata.txt",
delim = "\t", escape_double = FALSE,
trim_ws = TRUE)