DataArray不区分大小写的匹配,返回匹配的索引值

时间:2015-04-03 05:09:34

标签: regex grep match julia case-insensitive

我在函数中有一个DataFrame:

using DataFrames

myservs = DataFrame(serverName = ["elmo", "bigBird", "Oscar", "gRover", "BERT"],
                    ipAddress = ["12.345.6.7", "12.345.6.8", "12.345.6.9", "12.345.6.10", "12.345.6.11"])
myservs
5x2 DataFrame
| Row | serverName | ipAddress     |
|-----|------------|---------------|
| 1   | "elmo"     | "12.345.6.7"  |
| 2   | "bigBird"  | "12.345.6.8"  |
| 3   | "Oscar"    | "12.345.6.9"  |
| 4   | "gRover"   | "12.345.6.10" |
| 5   | "BERT"     | "12.345.6.11" |

如何编写函数以获取名为server的单个参数,不区分大小写,匹配server DataArray中的myservs[:serverName]参数,并返回匹配的ipAddress }?

在R中,可以使用

完成
myservs$ipAddress[grep("server", myservs$serverName, ignore.case = T)]

如果有人使用ElMoElmo作为server,或serverName保存为elmoELMO

2 个答案:

答案 0 :(得分:3)

我引用了如何在R中完成任务并尝试使用DataFrames pkg来完成任务,但我之所以这样做,是因为我来自R并且刚刚学习{{1} }。我向同事提出了很多问题,以下是我们提出的问题:

  

如果我要停止思考,这项任务会更加清晰   Julia中的vectorsR可以快速循环遍历循环。

     

即使如此,循环也不是最好的解决方案。我被告知要调查   Dicts(查看here示例)。 JuliaDict()zip()和   haskey()引起了我的注意。这些有很多应用。

     

我的解决方案甚至不需要使用get() pkg,而是使用它   使用Julia的DataFramesMatrix数据表示。使用Array   我们保持全球环境凌乱和服务器名称/ IP   列表保持隐藏,从视图到那些只运行的列表   功能

     

在示例代码中,我每次都在重新创建服务器矩阵,但在实际/实践中,我将拥有一个权限限制分隔文件,每次都会被读取。现在这没关系,因为分隔文件很小,但这可能效率不高或者是最好的方法。

let

答案 1 :(得分:2)

以这种方式:

julia> using DataFrames

julia> myservs = DataFrame(serverName = ["elmo", "bigBird", "Oscar", "gRover", "BERT"],
                           ipAddress = ["12.345.6.7", "12.345.6.8", "12.345.6.9", "12.345.6.10", "12.345.6.11"])
5x2 DataFrames.DataFrame
| Row | serverName | ipAddress     |
|-----|------------|---------------|
| 1   | "elmo"     | "12.345.6.7"  |
| 2   | "bigBird"  | "12.345.6.8"  |
| 3   | "Oscar"    | "12.345.6.9"  |
| 4   | "gRover"   | "12.345.6.10" |
| 5   | "BERT"     | "12.345.6.11" |

julia> grep{T <: String}(pat::String, dat::DataArray{T}, opts::String = "") = Bool[isna(d) ? false : ismatch(Regex(pat, opts), d) for d in dat]
grep (generic function with 2 methods)

julia> myservs[:ipAddress][grep("bigbird", myservs[:serverName], "i")]
1-element DataArrays.DataArray{ASCIIString,1}:
 "12.345.6.8"

修改

这个grep在我的平台上运行得更快。

julia> function grep{T <: String}(pat::String, dat::DataArray{T}, opts::String = "")
           myreg = Regex(pat, opts)
           return convert(Array{Bool}, map(d -> isna(d) ? false : ismatch(myreg, d), dat))
       end