在R中导入新文件类型

精细

我想创建一个将此语法类型文件导入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中的函数来删除标头...但是,如果我无法导入此文件,那是不可能的。

预先谢谢您,任何想法都会得到回报!

帕维尔(Pavel Obraztcov)

下面的代码将标头导入为命名字符向量,并将数据导入数据帧。

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)

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章