如何从CSV提取特定行并在R中格式化数据?

时间:2019-06-12 08:48:17

标签: r

我有一个包含数千行的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 个答案:

答案 0 :(得分:2)

您可以通过以下方式进行操作:

#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")

数据

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

答案 1 :(得分:1)

看看下面的代码是否有帮助

library(tidyverse)
df %>% 
  filter(grepl("\\.mp3|\\.avi", file_path)) %>% 
  mutate(file_path = paste(file_path, ID, sep="#")) %>% 
  pull(file_path) %>% dput

答案 2 :(得分:0)

data.table答案:

dt <- fread("file.csv")

fwrite(dt[V2 %like% "mp3$|avi$", .(paste0(V2, "#", V1))], "output.csv", col.names = FALSE)