Импортировать новый тип файла в R - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы создать функцию, которая импортирует эти файлы синтаксического типа в 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 ... но если я не могу импортировать этот файл, это невозможно.

Заранее спасибо, любые идеи будут вознаграждены!

1 Ответ

0 голосов
/ 03 января 2019

Код ниже импортирует заголовок как именованный символьный вектор, а данные - как фрейм данных.

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)

Возможно, необходима дополнительная очистка данных, но это должно быть довольно просто.

...