使用cypher語句的load csv
的方式纬霞,將要導入的文本進行處理脓规。每一個字符串兩邊使用雙引號進行包裹,當中的數(shù)據(jù)中险领,對于雙引號和反斜線進行轉義侨舆。對于雙引號的默認轉義方式是兩個雙引號秒紧。所以對于每個出現(xiàn)的雙引號前要多加一個雙引號,每個反斜線轉換成兩個反斜線挨下。感覺load csv
和neo4j-admin import
還有些不同熔恢,load csv
里面對于雙引號的轉義,使用""
臭笆,\"
都可以叙淌,所以這就導致了一個問題,就是比如這樣一個字符串"hello\"
愁铺,導入的時候鹰霍,最后一部分的\"
會被當成一個轉義的雙引號,也就是說這個被轉義的雙引號是字符串本身的內(nèi)容茵乱,而不是外部用來包裹這個字符串的雙引號茂洒。所以neo4j會去向后邊繼續(xù)找用來包裹這個字符串的后邊的雙引號,這樣就可能會引發(fā)錯誤瓶竭。
there's a field starting with a quote and whereas it ends that quote there seems to be characters in that field after that ending quote. That isn't supported.
所以索性所有在字符串中出現(xiàn)的雙引號督勺,都用兩個雙引號""
這樣的方式進行轉義,對于出現(xiàn)的反斜線斤贰,也都使用\\
進行轉義智哀。
轉換的代碼如下,其中包括了用來包裹的雙引號:
java版:
public static String dealQuote(String str) {
StringBuilder sb = new StringBuilder();
int i = 0, k = 0; // k means start cursor
while(true) {
if(str.charAt(i) == '\"') {
sb.append(str.substring(k, i));
sb.append("\"\"");
i++;
k = i;
} else if(str.charAt(i) == '\\') {
sb.append(str.substring(k, i));
sb.append("\\\\");
i++;
k = i;
} else {
i++;
}
if(i==str.length()) {
sb.append(str.substring(k, i));
break;
}
}
return "\"" + sb.toString() + "\"";
}
在IDEA中荧恍,可以將java代碼直接復制到scala文件中瓷叫,可以做自動轉換,但是有的地方轉換的不是很好送巡,最好code review一下赞辩,其中scala中是沒有break的,所以需要手動修改一下授艰。
def dealQuote(str: String): String = {
val sb = new StringBuilder
var i = 0
var k = 0 // k means start cursor
var flag = true
while ( flag ) {
if (str.charAt(i) == '\"') {
sb.append(str.substring(k, i))
sb.append("\"\"")
i += 1
k = i
} else if (str.charAt(i) == '\\') {
sb.append(str.substring(k, i))
sb.append("\\\\")
i += 1
k = i
} else i += 1
if (i == str.length) {
sb.append(str.substring(k, i))
flag = false
}
}
return "\"" + sb.toString + "\""
}