Как извлечь определенные строки из CSV и отформатировать данные в R? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть CSV-файл, который содержит тысячи строк, например:

1001;basket/files/legobrick.mp3
4096;basket/files/sunshade.avi
2038;data/lists/blockbuster.ogg
2038;data/random/noidea.dat

Я хочу записать это в новый CSV-файл, но включить только строки, содержащие «.mp3» или «.avi».,Выходной файл должен состоять из одного столбца и выглядеть следующим образом:

"basket/files/legobrick.mp3#1001",
"basket/files/sunshade.avi#4096",

Таким образом, первый столбец должен быть добавлен ко второму столбцу и разделен символом хэша, а каждая строка должна быть заключена в кавычки и разделена запятойкак показано выше.

Исходный CSV-файл не содержит заголовка с именами столбцов.Это просто данные.

Может кто-нибудь сказать мне, как кодировать это в R?

Редактировать (следуя за отмеченным ответом): Этот вопрос не является дубликатом, поскольку он включает в себя фильтрацию строк и формат выходного кодасовершенно разные, требующие разных методов обработки.Отмеченный ответ также совершенно другой, что действительно подтверждает мое утверждение, что это не дубликат.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

Вы можете сделать это следующим образом:

#Read the file with ; as separator
df <- read.csv2(text = text, header = FALSE, stringsAsFactors = FALSE)

#Filter the rows which end with "avi" or "mp3"
inds <- grepl("avi$|mp3$", df$V2)

#Create a new dataframe by pasting those rows with a separator
df1 <- data.frame(new_col = paste(df$V2[inds], df$V1[inds], sep = "#"))
df1

#                          new_col
#1 basket/files/legobrick.mp3#1001
#2  basket/files/sunshade.avi#4096

#Write the csv
write.csv(df1, "/path/of/file.csv", row.names = FALSE)

Или, если вы хотите, чтобы это был текстовый файл, вы можете сделать

write.table(df1, "path/test.txt", row.names = FALSE, col.names = FALSE, eol = ",\n")

data

text = "1001;basket/files/legobrick.mp3
4096;basket/files/sunshade.avi
2038;data/lists/blockbuster.ogg
2038;data/random/noidea.dat"
1 голос
/ 12 июня 2019

Посмотрите, поможет ли приведенный ниже код

library(tidyverse)
df %>% 
  filter(grepl("\\.mp3|\\.avi", file_path)) %>% 
  mutate(file_path = paste(file_path, ID, sep="#")) %>% 
  pull(file_path) %>% dput
0 голосов
/ 13 июня 2019

Ответ data.table:

dt <- fread("file.csv")

fwrite(dt[V2 %like% "mp3$|avi$", .(paste0(V2, "#", V1))], "output.csv", col.names = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...