CSV文件中图表的arangoimp

时间:2016-06-08 21:06:53

标签: csv graph arangodb

我在TSV文件中进行了网络扫描,其中包含的格式类似于以下示例

source IP      target IP       source port    target port
192.168.84.3   192.189.42.52   5868           1214
192.168.42.52  192.189.42.19   1214           5968
192.168.4.3    192.189.42.52   60680          22
....  
192.189.42.52  192.168.4.3     22             61969

有没有一种简单的方法可以使用arangoimp将其导入到(预先创建的)边缘集合networkdata中?

1 个答案:

答案 0 :(得分:2)

您可以组合the TSV importer,如果它不会导致转换IP失败(在ArangoDB 3.0中修复),那么您需要更多转换逻辑才能获得有效的CSV。在导入过程中,我们会使用ede attribute conversion option将前两列转换为有效的_from_to属性。

您不应该在其中指定包含空格的列主题,它应该是制表符或列数恒定。我们需要在主题行中指定_from_to字段。

为了使其正常工作,您可以通过sed管理上述内容,以获取有效的CSV和正确的列名,如下所示:

cat /tmp/test.tsv  | \
  sed -e "s;source IP;_from;g;" \
      -e "s;target IP;_to;" \
      -e "s; port;Port;g" \
      -e 's;  *;",";g' \
      -e 's;^;";' \
      -e 's;$;";' | \
   arangoimp --file - \
      --type csv \
      --from-collection-prefix sourceHosts \
      --to-collection-prefix targetHosts \
      --collection "ipEdges" \
      --create-collection true \
      --create-collection-type edge

使用这些正则表达式的sed将创建一个类似的中间表示:

"_from","_to","sourcePort","targetPort"
"192.168.84.3","192.189.42.52","5868","1214"

生成的边缘将如下所示:

{ 
  "_key" : "21056", 
  "_id" : "ipEdges/21056", 
  "_from" : "sourceHosts/192.168.84.3", 
  "_to" : "targetHosts/192.189.42.52", 
  "_rev" : "21056", 
  "sourcePort" : "5868", 
  "targetPort" : "1214" 
}