На прошлой неделе я помогал кому-то загружать данные из CSV-файла в Neo4j, и у нас были проблемы с фильтрацией строк, содержащих нулевое значение в одном из столбцов.
Вот как выглядели данные:
|
1
2
|
load csv with headers from "file:///foo.csv" as rowRETURN row |
|
1
2
3
4
5
6
7
|
╒══════════════════════════════════╕│row │╞══════════════════════════════════╡│{key1: a, key2: (null), key3: c}│├──────────────────────────────────┤│{key1: d, key2: e, key3: f} │└──────────────────────────────────┘ |
Мы бы хотели отфильтровать все строки, у которых ‘key2’ равно нулю, поэтому давайте настроим наш запрос, чтобы сделать это:
|
1
2
3
|
load csv with headers from "file:///foo.csv" as rowWITH row WHERE NOT row.key2 is nullRETURN row |
|
1
|
(no rows) |
Хм, это странно, он избавился от обоих рядов. Мы ожидаем увидеть вторую строку, так как она не имеет нулевого значения.
В этот момент мы можем заподозрить, что то, что мы видим на экране, на самом деле не выглядит как данные. Давайте напишем следующий запрос, чтобы проверить наши значения заголовка:
|
1
2
3
4
|
load csv with headers from "file:///foo.csv" as rowWITH row LIMIT 1UNWIND keys(row) AS keyRETURN key, SIZE(key) |
|
1
2
3
4
5
6
7
8
9
|
╒═════╤═════════╕│key │SIZE(key)│╞═════╪═════════╡│key1 │4 │├─────┼─────────┤│ key2│5 │├─────┼─────────┤│ key3│5 │└─────┴─────────┘ |
Второй столбец говорит нам, что в столбцах есть несколько дополнительных символов для «key2» и «key3» или, скорее, «key2» и «key3». В данном случае это пробелы, но это может быть другой символ:
|
1
2
3
4
|
load csv with headers from "file:///foo.csv" as rowWITH row LIMIT 1UNWIND keys(row) AS keyRETURN key, replace(key, " ", "_SPACE_") AS spaces |
|
1
2
3
4
5
6
7
8
9
|
╒═════╤═══════════╕│key │spaces │╞═════╪═══════════╡│key1 │key1 │├─────┼───────────┤│ key2│_SPACE_key2│├─────┼───────────┤│ key3│_SPACE_key3│└─────┴───────────┘ |
Если мы очистим наш CSV-файл и попробуем еще раз, все будет работать как положено:
|
1
2
3
4
|
load csv with headers from "file:///foo.csv" as rowWITH row LIMIT 1UNWIND keys(row) AS keyRETURN key, SIZE(key) |
|
1
2
3
4
5
6
7
8
9
|
╒════╤═════════╕│key │SIZE(key)│╞════╪═════════╡│key1│4 │├────┼─────────┤│key2│4 │├────┼─────────┤│key3│4 │└────┴─────────┘ |
|
1
2
3
|
load csv with headers from "file:///foo.csv" as rowWITH row WHERE NOT row.key2 is nullRETURN row |
|
1
2
3
4
5
|
╒═══════════════════════════╕│row │╞═══════════════════════════╡│{key1: d, key2: e, key3: f}│└───────────────────────────┘ |
| Ссылка: | Neo4j: Обнаружение мошеннических пространств в заголовках CSV с помощью LOAD CSV от нашего партнера JCG Марка Нидхэма в блоге Марка Нидхэма . |