【发布时间】:2019-06-26 23:50:11
【问题描述】:
因为我的 csv 文件已损坏,我正在使用以下方法将其读入 R:
dataDT <- data.table::fread(".../test.csv", sep = NULL)
它给出的数据集类似于:
dataDT <- data.table("ColA,ColB,ColC,ColD" = c("1,10,some text... , some text,,20190801",
"2,22,some text... , some text,,20190801",
"3,30,some text... , some text,,20170601"))
dataDT
> dataDT
ColA,ColB,ColC,ColD
1: 1,10,some text... , some text,,20190801
2: 2,22,some text... , some text,,20190801
3: 3,30,some text... , some text,,20170601
现在,我想要将每行中的字符串拆分为 4 个新列:
targetDT <- data.table(ColA = c(1,2,3),
ColB = c(10,22,30),
ColC = c("some text... , some text,", "some text... , some text,", "some text... , some text,"),
ColD = c("20190801","20190801",'20170601'))
targetDT
> targetDT
ColA ColB ColC ColD
1: 1 10 some text... , some text, 20190801
2: 2 22 some text... , some text, 20190801
3: 3 30 some text... , some text, 20170601
逻辑是:
- ColA 在第一个逗号之前有字符串;
- ColB 包含第一个和第二个逗号之间的所有内容;
- ColD 在最后一个逗号后有字符串;
- ColC 在中间部分有字符串(它可能包含额外的逗号)。
上面的逻辑如何实现?
编辑_1:
敏感数据,抱歉我无法提供确切数据。它看起来像:
ID,Code1,Project_Name,Report_Date
1: 123123,1, A & B,20100101
2: 1413,2, C, D and E,20120101
3: 53163,333, F, G,20140303
4: 23453,44,This is a name,20160801
5: 12645,555,5th test, to continue,20190501
所以,第一个逗号之前的所有内容肯定是数字,第一个和第二个逗号之间的所有内容也是如此。最后一个逗号之后的所有内容绝对是一个类似日期的 8 位数字。中间部分可以包含多个逗号,但不能包含引号(我猜这就是 fread 将逗号视为分隔符的原因)。
【问题讨论】:
-
请显示一些确切的数据。
some text可能不够具体,无法有人帮助您。 -
如果您可以在逗号处逻辑拆分数据,那么
fread会首先读取它。如果不能,则表明您在未引用的字符串中间有逗号。如果您可以定义一个规则来拆分这些字段*除了逗号(或删除那些特定的逗号),那么您将拥有它。查看数据中可用于实现这一目标的模式 -
每一列数据都可以放入编号数组中。稍后,序列中的每个数组元素都可用于创建一行。使用全局类型正则表达式调用来获取每个列数组。
(?:(?:^|,)\s*)(?:"([^"\\]*(?:\\.[^"\\]*)*)"|'([^'\\]*(?:\\.[^'\\]*)*)'|([^,]*))(?:\s*(?:(?=,)|$))循环执行此操作,每个匹配都是一个新元素,是第 1 组和第 2 组和第 3 组的加入。请看这里regex101.com/r/6uSkJI/1
标签: r regex data.table gsub