r - 在 R : Search all emails by subject line, 中,从正文中提取逗号分隔值,然后将值保存在数据框中

标签 r for-loop outlook rdcomclient

每天,我都会收到一封电子邮件,其中包含特定日期销售的水果数量。邮件结构如下:

Date of report:,04-JAN-2022
Time report produced:,5-JAN-2022 02:04
Apples,6
Pears,1
Lemons,4
Oranges,2
Grapes,7
Grapefruit,2

我正在尝试在 R 中构建一些代码,该代码将搜索我的电子邮件,查找具有特定主题的所有电子邮件,迭代每封电子邮件以查找我正在查找的变量,获取值并将它们放入将“报告日期”放入日期列中的数据框。

在社区人们的帮助下,我能够在Python中达到预期的结果。然而,随着我的项目的发展,如果可能的话,我现在需要在 R 中实现相同的结果。

不幸的是,我对 R 还很陌生,因此如果有人对如何推进这一工作有任何建议,我将不胜感激。

对于那些感兴趣的人,我的Python代码如下:

#PREP THE STUFF
Fruit_1 = "Apples"
Fruit_2 = "Pears"
searchf = [
    Fruit_1, 
    Fruit_2
]

#DEF THE STUFF
def get_report_vals(report, searches):
    dct = {}
    for line in report:
        term, *value = line
        if term.casefold().startswith('date'):
            dct['date'] = pd.to_datetime(value[0])
        elif term in searches:
            dct[term] = float(value[0])
    if len(dct.keys()) != len(searches):
    dct.update({x: None for x in searches if x not in dct})
return dct


#DO THE STUFF
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6) 
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)

results = []

for message in messages:
    if message.subject == 'FRUIT QUANTITIES':
        if Fruit_1 in message.body and Fruit_2 in message.body:
            data = [line.strip().split(",") for line in message.body.split('\n')]
            results.append(get_report_vals(data, searchf))
        else:
            pass

fruit_vals = pd.DataFrame(results)
fruit_vals.columns = map(str.upper, fruit_vals.columns)

我可能会以错误的方式处理这个问题,但我正在尝试使用我在Python中采取的步骤在R中实现相同的结果。例如,我创建了一些变量来保存我正在销售的水果搜索,然后创建一个向量来存储可搜索项,然后当我创建等效的“get_vals”函数时,我创建一个空向量。

library(RDCOMClient)

Fruit_1 <- "Apples"
Fruit_2 <- "Pears"
##Create vector to store searchables
searchf <- c(Fruit_1, Fruit_2)
## create object for outlook
OutApp <- COMCreate("Outlook.Application")
outlookNameSpace = OutApp$GetNameSpace("MAPI")

search <- OutApp$AdvancedSearch("Inbox", "urn:schemas:httpmail:subject = 'FRUIT QUANTITIES'")
inbox <- outlookNameSpace$Folders(6)$Folders("Inbox")

vec <- c()

for (x in emails)
{
  subject <- emails(i)$Subject(1)
  if (grepl(search, subject)[1])
  {
    text <- emails(i)$Body()
    print(text)
    break
  }
}

最佳答案

read.table 可能是 get_report_vals 的良好开端。
下面的代码将结果输出为列表,但仍需要实现异常处理:

report <- "
Date of report:,04-JAN-2022
Apples,6
Pears,1
Lemons,4
Oranges,2
Grapes,7
Grapefruit,2
"


get_report_vals <- function(report,searches) {
  data <- read.table(text=report,sep=",")
  colnames(data) <- c('key','value')

  # find date
  date <- data[grepl("date",data$key,ignore.case=T),"value"]
  
  # transform dataframe to list
  lst <- split(data$value,data$key)
  
  # output result as list
  c(list(date=date),lst[searches])
}

get_report_vals(report,c('Lemons','Oranges'))
$date
[1] "04-JAN-2022"

$Lemons
[1] "4"

$Oranges
[1] "2"

然后可以使用 rbind 将各种报告的结果连接到 data.frame 中:

rbind(get_report_vals(report,c('Lemons','Oranges')),get_report_vals(report,c('Lemons','Oranges')))
     date          Lemons Oranges
[1,] "04-JAN-2022" "4"    "2"    
[2,] "04-JAN-2022" "4"    "2"

关于r - 在 R : Search all emails by subject line, 中,从正文中提取逗号分隔值,然后将值保存在数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70894438/

相关文章:

r - 加入两个数据框 - 通过组合保持属性

Python 逻辑或运算符行为奇怪

json - 如何通过 Microsoft Graph API 添加内嵌图像?

css - 时事通讯 HTML : fonts and vertical align

r - R如何看待日期向量?

r - 为 gtsummary 包设置默认主题和粗体变量

python 写错误

javascript - jQuery:将每个函数转换为 for 循环

c# - 如何获取 outlook 用户列表的忙/闲状态(以及如何获取用户列表)?

r - 用 NA 填充时间序列中缺失的月份