使用随机数量的空格读取文件
Read file with random number of whitespaces
我需要读取几个以随机数量的空格作为分隔符的文件。
数据总是有 4 列,并且总是用 Whitespace > 1
分隔。
Whitespace = 1
在列中用作普通空格但不是分隔符。
数据
File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open
我尝试了 strip.white.space
、read_table
、gsub
等变体,但无法正常工作。
1) 用逗号替换 2 个或更多 space 的重复并作为 csv 读入。
# L <- readLines("myfile.txt")
L <- readLines(textConnection(Lines))
read.csv(text = gsub(" +", ",", L))
给予:
File Name Time Status
1 Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
2 Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
3 Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
4 Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open
2) 因为内部 spaces 有一个模式,即字段内部有 0, ?, 1 和 0 spaces分别,我们可以交替使用正则表达式解析它。只要此模式成立,即使字段仅由一个 space 分隔,它也能正常工作。在这种情况下,我们单独处理 header。将 text=Lines
替换为您在 (1) 中的注释中的文件名以与文件一起使用。
library(gsubfn)
pat <- "^(\S+) +(.*) +(\S+ \S+) +(\S+)$"
read.pattern(text = Lines, pattern = pat, skip = 1,
col.names = read.table(text = Lines, nrow = 1))
备注
Lines <- "File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open"
用文件名替换输入:
library(data.table)
DT <- fread("File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open",
sep = "", skip = 1, header = FALSE)
DT <- DT[, tstrsplit(V1, " {2,}")] #match two or more blanks
setnames(DT, unlist(fread("File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open",
nrows = 1, header = FALSE)))
DT
# File Name Time Status
#1: Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
#2: Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
#3: Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
#4: Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open
我需要读取几个以随机数量的空格作为分隔符的文件。
数据总是有 4 列,并且总是用 Whitespace > 1
分隔。
Whitespace = 1
在列中用作普通空格但不是分隔符。
数据
File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open
我尝试了 strip.white.space
、read_table
、gsub
等变体,但无法正常工作。
1) 用逗号替换 2 个或更多 space 的重复并作为 csv 读入。
# L <- readLines("myfile.txt")
L <- readLines(textConnection(Lines))
read.csv(text = gsub(" +", ",", L))
给予:
File Name Time Status
1 Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
2 Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
3 Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
4 Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open
2) 因为内部 spaces 有一个模式,即字段内部有 0, ?, 1 和 0 spaces分别,我们可以交替使用正则表达式解析它。只要此模式成立,即使字段仅由一个 space 分隔,它也能正常工作。在这种情况下,我们单独处理 header。将 text=Lines
替换为您在 (1) 中的注释中的文件名以与文件一起使用。
library(gsubfn)
pat <- "^(\S+) +(.*) +(\S+ \S+) +(\S+)$"
read.pattern(text = Lines, pattern = pat, skip = 1,
col.names = read.table(text = Lines, nrow = 1))
备注
Lines <- "File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open"
用文件名替换输入:
library(data.table)
DT <- fread("File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open",
sep = "", skip = 1, header = FALSE)
DT <- DT[, tstrsplit(V1, " {2,}")] #match two or more blanks
setnames(DT, unlist(fread("File Name Time Status
Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open",
nrows = 1, header = FALSE)))
DT
# File Name Time Status
#1: Let_L12M.xlsm NameA NameAB 2021-02-09 13:15:50 open
#2: Let_L12M.xlsm NameC NameCA NameCB 2021-05-10 07:19:21 open
#3: Let_L12M.xlsm NameD NameDA NameDB 2021-05-10 07:21:35 open
#4: Let_L12M.xlsm NameA NameAB 2021-05-10 11:11:23 open