用逗号将未引号的字符串导入csv;每行-都忽略第三个逗号?

时间:2019-04-19 01:41:53

标签: r csv

我有一个.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)

3 个答案:

答案 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)。