对 dbNames 的 Depends,去除该列中的小括号以及括号里面的内容,并去除 换行和行尾空格(注:可以 sample_n 几行来测试你的函数结果)。最终形成为一 个新 tibble,名为 dbClean。(
时间: 2024-03-16 08:46:27 浏览: 15
假设您已经连接到了数据库,并且使用`dbGetQuery()`函数将`dbNames`表格中的数据读取到了R中,可以按以下步骤去除`Depends`列中的小括号及括号中的内容,并去除换行和行尾空格:
```
library(tidyverse)
# 读取dbNames数据到R中
dbNames <- dbGetQuery(con, "SELECT * FROM dbNames")
# 取前10行进行测试
dbNames_sample <- dbNames %>% sample_n(10)
# 去除Depends列中的小括号及括号中的内容,并去除换行和行尾空格
dbClean <- dbNames_sample %>%
mutate(Depends = str_replace_all(Depends, "\\(.*?\\)", "")) %>%
mutate(Depends = str_replace_all(Depends, "\n", "")) %>%
mutate(Depends = str_trim(Depends)) %>%
select(-Description)
# 查看结果
dbClean
```
上述代码中,`str_replace_all()`函数用于去除小括号及括号中的内容,`"\(.*?\)"`是正则表达式,表示匹配小括号及其包含的任意字符,`"\n"`表示匹配换行符,`str_trim()`函数用于去除行尾空格。`select()`函数用于删除`Description`列,因为题目中并未要求保留该列。
相关问题
for _, dbName := range dbNames { for _, v := range *pots { // fmt.Println(k, v) if v.Pot_Info.SignName == dbName { fmt.Println(v) DbPots = append(DbPots, v) break } else { WebPots = append(WebPots, v) // fmt.Println(v) } } }在上述代码中,如何删除第二个for循环的pots某个元素?
要删除第二个for循环的pots中的某个元素,可以使用切片的方式进行删除。具体的实现方法如下:
1. 首先找到要删除的元素在切片中的索引位置,可以使用range循环遍历切片,找到要删除元素的索引位置。
2. 使用切片的append方法,将要删除的元素前后的部分重新组合成一个新的切片,从而实现删除该元素的目的。
代码示例:
```
for i, v := range *pots {
if v.Pot_Info.SignName == dbName {
// 删除该元素,使用切片的append方法重新组合切片
*pots = append((*pots)[:i], (*pots)[i+1:]...)
DbPots = append(DbPots, v)
break
} else {
WebPots = append(WebPots, v)
}
}
```
需要注意的是,在删除元素后,切片的长度和容量都会发生变化。因此,在使用切片的append方法时,需要注意重新分配新的切片。
// 传入所有蜜罐信息,开始攻击蜜罐 func AttackPots(pots *[]Pot) { // 预先定义好数据库蜜罐名称,如果名称匹配就去调用攻击数据库函数 dbNames := []string{"Redis", "MySQL", "PostgreSQL"} //预先定于存储web蜜罐的变量 WebPots := []Pot{} //预先定于存储db蜜罐的变量 DbPots := []Pot{} // 获取所有蜜罐名称 // fmt.Println(pots) for _, dbName := range dbNames { for k, v := range *pots { fmt.Println(k, v) if v.Pot_Info.SignName == dbName { DbPots = append(DbPots, v) // fmt.Println(v) } else { WebPots = append(WebPots, v) // fmt.Println(v) } } } // //调用攻击web蜜罐函数 // AttackWebPots(&WebPots) // AttackDataBasePots(&DbPots) }在上述代码中,第二个for循环怎么样才能执行一次
要想让第二个for循环只执行一次,可以使用break语句。当找到第一个匹配的蜜罐名称时,使用break语句跳出循环即可。修改后的代码如下:
```
for _, dbName := range dbNames {
for k, v := range *pots {
fmt.Println(k, v)
if v.Pot_Info.SignName == dbName {
DbPots = append(DbPots, v)
// fmt.Println(v)
break //找到匹配的蜜罐名称后跳出循环
} else {
WebPots = append(WebPots, v)
// fmt.Println(v)
}
}
}
```