Función R que analiza el file de text y extrae un valor específico

Tengo dos files: file csv y file de text. en el file csv, solo tengo una identificación de compromiso, mientras que en el file de text, tengo un logging de compromiso que incluye una identificación de compromiso y su información relacionada.

Necesito escribir una function en R que haga lo siguiente:

  1. Lee los dos files.
  2. Para cada ID de confirmación en csv, busque esa ID en el file de text, analice el text después de la ID y obtenga el número después de "'" y antes del espacio "" (que es 4 en el ejemplo anterior).
  3. Guarde el número extraído en una nueva columna en el file csv.

Código

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) 

Sin embargo, no puede fusionar los datos.

El formatting del file de text es 'commit ID; nombre del commiter; dedicar time; descripción 'mientras que algunos loggings incluyen información adicional' commit ID; nombre del commiter; dedicar time; description 'num num parche de file (como commit ID ba37902179 a continuación).

Ejemplo: '99e88cb4c9; Yulin Wang; Lun Sep 11 08:43:32 2017 -0700; Solicitud de extracción de fusión # 418 de ZwoCa / master' '9be3838165; Sebastian; Lun Sep 11 15:06:07 2017 +0200; Solicitud de extracción de fusión # 1 de ZwoCa / ZwoCa-patch-1 '' ba37902179; Sebastian; Lun Sep 11 15:00:33 2017 +0200; Aserción invertida fija '1 1 data / org.eclipse.birt.data / src / org / eclipse / birt / data / engine / executor / transform / SimpleResultSet.java'f6d86d5f95; Gary Xue; lun 28 de agosto, 20:51:37 2017 -0400; Solicitud de extracción de fusión n.º 417 de Bharadwaj14 / master '' 95acb82708; Gary Xue; lun, 28 de agosto 20:50:29 2017 -0400; request de extracción de fusión # 416 de rrimmana / master '' 3ff8e99b70; Bharadwaj Tirunagaru; lun 28 de agosto 15:18:13 2017 +0530; eliminación de 3289.patch '0 102 3289.patch'1dbc5116ae; rrimmana; Lun 28 de agosto 15:06:13 2017 +0530; Un informe que se basa en el controller Mongo ODA con authentication Kerberos desactivada cuando la connection a Mongo DB, utilizando el controller ODA, está generando NPE. Es un error de compatibilidad con versiones anteriores. 2 5 data / org.eclipse.birt.data.oda.mongodb / src / org / eclipse / birt / data / oda / mongodb / impl / MongoDBDriver.java '

basado en el ejemplo, creo que la solución sería algo así como

 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) 

Este código analizará los datos que proporcionó y fusionará los elementos con una ID de confirmación coincidente en un dataframe separado y luego escribirá el nuevo dataframe como un CSV. Las dos líneas comentadas son las que usarías para tus datos reales. Depende en gran medida de que el formatting sea el que especificó en su pregunta, de modo que si hay alguna desviación en los files de logging, no analizará las líneas correctamente. También será necesario cambiar el nombre de la columna CID para que coincida con lo que realmente está en su file 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) 

Al observar el formatting en el file de text, creo que la function unlist (strsplit) debería ser algo así como

 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) 

porque no toda la queue tiene los dos numbers después. pero no estoy seguro de cómo formular la condición IF arriba.