在 R 中导入新文件类型

Import a new file type in R

我想创建一个将这个 syntax-type 文件导入 R 的函数。这些文件的格式如下:

!!!
!!!
!!!
!!!
!!!
!!!
!!!
!!!
**kern  **dynam **kern  **dynam  <--------Here is determined the number of columns (4)
*staff2 *   *staff1 *staff1/2
*>[A,A,B,B] *   *>[A,A,B,B] *>[A,A,B,B]
*>norep[A,B]    *   *>norep[A,B]    *>norep[A,B]
*>A *   *>A *>A
*clefF4 *   *clefG2 *clefG2
*k[b-]  *   *k[b-]  *k[b-]
*F: *   *F: *F:
*M3/4   *   *M3/4   *M3/4
*MM108  *   *MM108  *MM108
16r .   16f f
=1  =1  =1  =1
!LO:TX:b:i:t=legato !   !   !
12FL    .   4cc .
12A .   .   .
12cJ    .   .   .
.   .   (32bnqq/    .
12GL    .   4cc)    .
12B-    .   .   .
12cJ    .   .   .
.   .   (32bqLLL>   .
.   .   32ccq   .
.   .   32ddqJJJ    .
12FL    .   4cc)    .
12A .   .   .
12cJ    .   .   .
=2  =2  =2  =2
*Xtuplet    *   *Xtuplet    *

因此,可以通过某种方式将文件转换为 csv 以导入到 R 中。每个文件的列数可能不同(通常为 1 到 50)。

我尝试了 data_imported<-import("sonata.krn", format = "csv") 但我收到以下错误:

Warning messages:
1: In fread(dec = ".", input = "son.krn", sep = "auto", header = "auto",  :
  Detected 1 column names but the data has 4 columns (i.e. invalid file). Added 3 extra default column names at the end.
2: In fread(dec = ".", input = "son.krn", sep = "auto", header = "auto",  :
  Stopped early on line 101. Expected 4 fields but found 5. Consider fill=TRUE and comment.char=. First discarded non-empty line: <<4FF 4F      .       (<12g 12b-L     2ryy    f>>

但是,文件的第一部分显示在控制台中。问题是我想使任务自动化,因此应该使用 R 中的函数删除 header...但是如果我无法导入此文件,那是不可能的。

提前致谢,有想法必打赏!

下面的代码将 header 作为命名字符向量导入,并将数据作为数据框导入。

fn <- "sonata.krn"

# Read all the lines
lines <- readLines(con = fn)

# Get the header and the data
start <- 1
while (grepl("^!!!", lines[start])) {
  start <- start + 1
}

header <- lines[1:(start - 1)]
# Convert the header into a named vector
names(header) <- gsub("^!!!([[:alpha:][:digit:]]+):.*", "\1", header)
header <- gsub("^!!![[:alpha:][:digit:]]+: ", "", header)

# Lines containing the data
lines <- lines[-(1:(start - 1))]

# Substitute TABs for column delimiters
lines <- gsub(" +", "\t", lines)

# Import the data
d <- read.delim(textConnection(lines), sep = "\t",
                stringsAsFactors = FALSE)

可能需要进行一些额外的数据清理,但这应该非常简单。