我有一个包含数千行的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编写代码吗?
编辑(后面带有标记的答案):此问题不是重复的,因为它涉及过滤行,并且输出代码格式完全不同,需要不同的处理方法。标记的答案也完全不同,这确实支持了我的说法,即不是重复。
答案 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)