使用随机数量的空格读取文件

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.spaceread_tablegsub 等变体,但无法正常工作。

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