我有一个.csv文件,其中包含3个目标列-IP地址,时间戳和一些数据。地址和时间戳由一个逗号分隔,并且其中没有逗号。但数据字段中有逗号。例如,这是文件中的前4个条目-
142.XX.XXX.XXX,2019-03-13T23:52:07.449219,abc
192.XX.XXX.XXX,2019-03-13T23:52:11.965405,
13.XX.XXX.XXX,2019-03-13T23:52:09.903720,HTTPWed, 13 Mar 2019,XXXXXX,
71.XX.XXX.XXX,2019-03-13T23:52:23.529145,HTTP/1.1/n\n
保证每个条目仅占用一行;并将遵循以下格式;其中数据可以包含0到n个逗号-
ip_adr,timestamp,data
在忽略/删除给定行的每个第三个逗号之后,是否可以读取.csv文件?
我尝试设置FLUSH = TRUE,根据我所读的内容应该可以解决该问题,但事实并非如此。如何修改read.csv语句以解决此问题?
data <- read.csv(file="D:/Shodan/data.csv", header = FALSE, stringsAsFactors = FALSE, skipNul = TRUE, flush=TRUE)
答案 0 :(得分:2)
我建议使用stri_split_fixed
:
library(data.table)
library(stringi)
x <- readLines('test.txt')
res <- transpose(stri_split_fixed(x, ',', n = 3))
as.data.table(res)
# V1 V2 V3
# 1: 142.XX.XXX.XXX 2019-03-13T23:52:07.449219 abc
# 2: 192.XX.XXX.XXX 2019-03-13T23:52:11.965405
# 3: 13.XX.XXX.XXX 2019-03-13T23:52:09.903720 HTTPWed, 13 Mar 2019,XXXXXX,
# 4: 71.XX.XXX.XXX 2019-03-13T23:52:23.529145 HTTP/1.1/n\\n
答案 1 :(得分:1)
1)捕获,请使用strcapture
,其中在末尾的注释中给出了行。不使用任何软件包。
# L <- trimws(readLines("myfile.dat"))
L <- trimws(readLines(textConnection(Lines)))
L <- L[L != ""]
strcapture("^(.*?),(.*?),(.*)", L,
list(ip_adr = character(0), timestamp = character(0), data = character(0)))
给予:
ip_adr timestamp data
1 142.XX.XXX.XXX 2019-03-13T23:52:07.449219 abc
2 192.XX.XXX.XXX 2019-03-13T23:52:11.965405
3 13.XX.XXX.XXX 2019-03-13T23:52:09.903720 HTTPWed, 13 Mar 2019,XXXXXX,
4 71.XX.XXX.XXX 2019-03-13T23:52:23.529145 HTTP/1.1/n
2)sub / read.table 另外一种可能性是用分号代替前两个逗号,然后使用分号分隔符进行读取。 L来自上方:
read.table(text = sub(",", ";", sub(",", ";", L)), sep = ";", as.is = TRUE,
col.names = c("ip_addr", "timestamp", "data"))
Lines <- "142.XX.XXX.XXX,2019-03-13T23:52:07.449219,abc
192.XX.XXX.XXX,2019-03-13T23:52:11.965405,
13.XX.XXX.XXX,2019-03-13T23:52:09.903720,HTTPWed, 13 Mar 2019,XXXXXX,
71.XX.XXX.XXX,2019-03-13T23:52:23.529145,HTTP/1.1/n\n"
答案 2 :(得分:0)
在读取csv并合并列之后,我们可以使用unite
df <- read.csv("path_of_file.csv", header = FALSE)
在您的示例中,您希望合并3:5
列,以便我们可以做到
tidyr::unite(df, data, paste0("V", 3:5), sep = " ")
# V1 V2 data
#1 142.XX.XXX.XXX 2019-03-13T23:52:07.449219 abc
#2 192.XX.XXX.XXX 2019-03-13T23:52:11.965405
#3 13.XX.XXX.XXX 2019-03-13T23:52:09.903720 HTTPWed 13 Mar 2019 XXXXXX
#4 71.XX.XXX.XXX 2019-03-13T23:52:23.529145 HTTP/1.1/n\\n
使用基数R,您还可以将apply
行和paste
列一起使用
df$data <- apply(df[3:5], 1, paste0, collapse = " ")
您以后可能要删除不需要的列(V3:V5
)。