csv - Neo4j 使用分隔符在 CSV 文档中加载 CSV 处理数组
问题描述
我正在使用从toLOAD CSV
导入数据。我的数据集在该字段中包含多个值。目前我使用分号作为这些多个值的分隔符。csv
neo4j
country
节点-person.csv
id,country
http://author,country1;country2;country3
这是我用来将数据导入的密码查询neo4j
LOAD CSV WITH HEADERS FROM "file:///nodes-person.csv" AS csvLine
MERGE (p:`person` {id: csvLine.id})
ON CREATE
SET
p.country = split(csvLine.country,";")
ON MATCH
SET
p.country = split(csvLine.country,";")
RETURN p;
我的问题是,如果值包含分隔符,如何正确拆分值。
IE:
country\\;1 ; country\\;2 ; country\\;3
解决方案
你有几个选择 - 一个是纯 Cypher 并且略显凌乱,另一个是使用 APOC 和正则表达式。我假设如果分号出现在国家名称中,它会用一个反斜杠转义。
密码路线
这里的计划是做三个替换:
- 用一些不太可能显示为国家名称的字符串替换转义分号的实例(例如,
__SEMICOLON__
) - 到目前为止,用分号分割字符串
- 在拆分产生的每个字符串中,
__SEMICOLON__
用分号字符替换实例
像下面这样的东西会起作用(WITH
只是它可以单独运行):
WITH 'country1\\;;country2;country3\\;' as countries
RETURN [x in split(replace(countries, '\\;', '__SEMICOLON__'), ';') | replace(x, '__SEMICOLON__', ';')]
APOC 和正则表达式
一种更简洁的方法是使用apoc.text.replace
并提供正则表达式作为“分隔符”,我们希望用分号分隔字符串,而分号前面没有反斜杠转义字符:
WITH 'country1\\;;country2;country3\\;' as countries
RETURN [x in apoc.text.split(countries, '(?<!\\\\);') | replace(x, '\\;', ';')]
我们进行最后的整理,用普通分号替换转义的分号,以便使用该列表理解进行存储。正则表达式从这个答案中被无耻地窃取了。
推荐阅读
- google-apps-script - 广告脚本中的 ScriptApp.newTrigger?
- functional-programming - Julia 中有没有办法修改函数 f(x) 使其返回 f(x)*g(x)
- javascript - 粘性标题在出现时动画但在消失时不动画
- python - 如何修复 UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d : character maps to
? - ffmpeg - 是否可以通过 MPEG-DASH 流式传输 MJPEG 内容?
- python - python:在带有正则表达式的字符串中的单词之间插入逗号分隔符
- javascript - Highcharts Gantt - 如何强制数据标签始终高于里程碑?
- reactjs - React Native,如何更改按钮 onPress 的样式并保留样式
- javascript - 如何将 ant build.xml 转换为节点脚本?
- join - 如何连接、连接或合并具有非唯一多索引的数据帧?