我有两个文件:csv file&文本文件。在csv文件中,我只提交了ID,而在文本文件中,我有提交日志,其中包含提交ID及其相关信息。
我需要在R中编写一个执行以下操作的函数:
代码
birt =read.csv("C:/path/Obirt.csv", header =T)
cvs = data.frame(CID = C(birt$commitID)
txt = readLines("C:/path/summary.txt")
tail(unlist(strsplit(txt,"'")), 2)
tmp = data.frame(t(sapply(txt, function(x) c(unlist(strsplit(unlist(strsplit(x, "'"))[2], ';')), tail(unlist(strsplit(unlist(strsplit(x, "'"))[3], ' ')), 2)), USE.NAMES = F)))
colnames(tmp) = c('CID', 'COMMIT_NAME', 'COMMIT_TIME', 'COMMIT_SUB', 'NUM1', 'NUM2')
newcsv = merge(cvs, tmp, by='CID')
write.csv(newcsv, 'C:/Users/abdul/desktop/umbc/birt/newcsv.csv', row.names = F)
但是,它无法合并数据。
文本文件格式为'commit ID;提交者名称;提交时间; description'而某些记录包含附加信息'提交ID;提交者名称;提交时间; description'num num补丁文件(如下面的提交ID ba37902179)。
实施例: '99e88cb4c9; Yulin Wang; Mon Sep 11 08:43:32 2017 -0700;合并拉动请求#418来自ZwoCa / master' '9be3838165; Sebastian;周一9月11日15:06:07 + 0200; ZwoCa / ZwoCa-patch-1合并拉动请求#1' 'ba37902179;塞巴斯蒂安;星期一9月11日15:00:33 2017 +0200;修正倒置断言' 1 1 data / org.eclipse.birt.data / src / org / eclipse / birt / data / engine / executor / transform / SimpleResultSet.java'f6d86d5f95; Gary Xue; Mon Aug 28 20:51:37 2017 -0400; Merge来自Bharadwaj14 / master的拉请求#417' '95acb82708; Gary Xue;星期一8月28日20:50:29 2017 -0400;合并拉动请求#416来自rrimmana / master' '3ff8e99b70; Bharadwaj Tirunagaru; Mon Aug 28 15:18:13 2017 +0530;删除3289.patch' 0 102 3289.patch'1dbc5116ae; rrimmana;星期一8月28日15:06:13 2017 +0530;基于Mongo ODA驱动程序和Kerberos身份验证的报告已关闭,其中使用ODA驱动程序连接到Mongo DB正在抛出NPE。它是一个向后兼容的bug。 2 5 data / org.eclipse.birt.data.oda.mongodb / src / org / eclipse / birt / data / oda / mongodb / impl / MongoDBDriver.java'
基于这个例子,我认为解决方案就像
tmp = data.frame(t(sapply(txt, function(x)unlist(strsplit(unlist(strsplit(x, "'"))[2], ';')))))
if (//there is Not"''" at the end of a tail//) // i am not sure how to make
such condition
Then tmp = c(tail(unlist(strsplit(unlist(strsplit(x, "'"))[3], ' ')), 2),
USE.NAMES = F)
答案 0 :(得分:0)
此代码将解析您提供的数据,并在单独的数据框中将元素与匹配的提交ID合并,然后将新数据帧作为CSV写出。两条注释行是您用于实际数据的行。它高度依赖于您在问题中指定的格式,因此如果日志文件中存在任何偏差,则无法正确解析行。此外,还需要更改列名CID
以匹配CSV文件中的实际内容。
csv = data.frame(CID = c('A1234', 'B1234', 'C1234'))
#csv = read.csv('csvfile.csv')
txt = c("'A1234;commmiter name;commmit time;commmit subject' 4 1","'B1234;commmiter name;commmit time;commmit subject' 5 1","'C1234;commmiter name;commmit time;commmit subject' 6 1")
#txt = readLines('textfile.txt')
tail(unlist(strsplit(txt, "'")), 2)
tmp = data.frame(t(sapply(txt, function(x) c(unlist(strsplit(unlist(strsplit(x, "'"))[2], ';')), tail(unlist(strsplit(unlist(strsplit(x, "'"))[3], ' ')), 2)), USE.NAMES = F)))
colnames(tmp) = c('CID', 'COMMIT_NAME', 'COMMIT_TIME', 'COMMIT_SUB', 'NUM1', 'NUM2')
newcsv = merge(csv, tmp, by='CID')
write.csv(newcsv, 'newcsv.csv', row.names = F)
答案 1 :(得分:0)
通过观察文本文件中的格式,我认为unlist(strsplit)函数应该类似于
tmp = data.frame(t(sapply(txt, function(x)unlist(strsplit(unlist(strsplit(x, "'"))[2], ';')))))
if (//there is Not"''" at the end of a record//) // i am not sure how to make
such condition
Then tmp = c(tail(unlist(strsplit(unlist(strsplit(x, "'"))[3], ' ')), 2),
USE.NAMES = F)
因为并非所有尾部都有两个数字。但我不确定如何制定上述IF条件。