2016-09-12 2 views
2

Я пытаюсь прочитать файл CSV, который использует обратную косую черту, чтобы избежать разделителей вместо использования кавычек. Я попытался построить DataFrameReader без qoutes и с escape-символом, но он не работает. Кажется, опция «побег» может использоваться только для того, чтобы избежать символов кавычек. Есть ли способ обойти это иначе, чем формировать пользовательский формат ввода?Spark 2.0 Scala - Чтение csv-файлов с экранированными разделителями

Вот варианты, которые я использую сейчас:

spark.read.options(Map(
    "sep" -> ",", 
    "encoding" -> "utf-8", 
    "quote" -> "", 
    "escape" -> "\\", 
    "mode" -> "PERMISSIVE", 
    "nullValue" -> "" 

Для примера скажем, мы имеем следующие данные выборки:

схемы: Имя, город

Joe Bloggs,Dublin\,Ireland 
    Joseph Smith,Salt Lake City\,\ 
    Utah 

Это должно вернуть 2 записи:

Name   |  City 
-----------------|--------------- 
Joe Bloggs  | Dublin,Ireland 
Joseph Smith  | Salt Lake City, 
Utah 

Будучи в состоянии избежать новых строк, было бы неплохо, но нужно избегать разделителя столбцов. Пока я думаю о чтении строк с помощью spark.textFile, а затем используя некоторую библиотеку CSV для разбора отдельных строк. Это устранит мою проблему с разделителем столбцов, но не экранирует строки.

+0

Вы можете предоставить примерный формат строки? –

+0

Я думаю, что вы правы, pls [check] (https://github.com/databricks/spark-csv/blob/master/src/main/scala/com/databricks/spark/csv/package.scala) –

+0

Пример данные добавляются к вопросу. –

ответ

0

Кажется, что это не поддерживается в считывателе CSV (см. https://github.com/databricks/spark-csv/issues/390).

Я собираюсь догадаться, что самый простой способ - проанализировать ваши строки вручную; вовсе не идеальный, но функциональный и не слишком жесткий.

Вы можете разделить свои линии, используя отрицательное регулярное выражение lookbehind, например. (?<!\\), - это будет соответствовать любой запятой, которой не предшествует обратная косая черта.

Смежные вопросы