Обрабатывать двойную кавычку при экспорте фрейма данных в CSV

У меня есть фрейм данных, который содержит двойную кавычку ("") и запятую в значении. Я пытаюсь экспортировать фрейм данных в CSV, но, к сожалению, двойная кавычка не отображается должным образом в экспортированном CSV.

Мне удалось обработать все другие специальные символы, установив для «quoteAll» значение true.

В csv, если вы замените одинарную двойную кавычку двумя двойными кавычками, все будет работать нормально. Но когда я экспортирую в csv код ниже, он заменяет «на» в экспортированном csv.

%scala
import org.apache.spark.sql.functions.regexp_replace
val df = Seq((1, "A,B,C,\"DEF\""), (2, "DEF")).toDF("ID", "Val")

val updatedDf = df.columns.foldLeft(df)((acc, colname) => acc.withColumn(colname,regexp_replace(acc(s"`$colname`"), "\"", "\"\"")))


deltaDS.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.mode("Overwrite").csv("[Location to store csv]")

Вывод:

Ожидаемый результат:

Как я могу справиться с этим?

Может быть, charToEscapeQuoteEscaping из Spark - Документация CSV может помочь? Пожалуйста, взгляните также на escape и escapeQuotes, так как они, кажется, работают вместе.

rainingdistros 14.11.2022 08:01
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
0
1
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Судя по вводу, следующие данные, по-видимому, являются выходными данными.

ДФ:

ОбновленДФ:

Поскольку для параметра quoteAll установлено значение true, он будет работать, как указано в документации по искре.

При преобразовании в CSV вывод выглядит следующим образом.

Дф.csv:

"ID","Val"
"1","A,B,C,\"DEF\""
"2","DEF"

Обновленный файл DF.csv:

"ID","Val"
"1","A,B,C,\"\"DEF\"\""
"2","DEF"

Одно из предложений по работе с escape-символом - использовать исходный фрейм данных и сделать escape-символ пустым. Но, пожалуйста, будьте осторожны с тем, как это может повлиять на другие специальные символы.

%scala
df.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.option("escape", "")
.mode("Overwrite").csv("<path>/tst_1dq_noesc.csv")
"ID","Val"
"1","A,B,C,"DEF""
"2","DEF"

Надеюсь, это ожидаемый результат...

Не могу пустой побег. У меня также есть новые линейные символы. \n\r и т.д...

ConfusedDeveloper 14.11.2022 10:29
Ответ принят как подходящий

Вы не предоставили точный открытый текст csv, который вы ожидаете, поэтому трудно догадаться. Вы ищете это?

val df = Seq((1, "A,B,C,\"DEF\""), (2, "DEF")).toDF("ID", "Val")

df.coalesce(1).write
.option("header", true)
.option("encoding", "utf-8")
.option("quoteAll", true)
.option("escape", "\"")  // escapes quotes inside quote using "
.mode("Overwrite").csv("xxx")

Результирующий CSV:

"ID","Val"
"1","A,B,C,""DEF"""
"2","DEF"

Это сработало. Мне не хватало .option("escape", "\"") Огромное спасибо.

ConfusedDeveloper 15.11.2022 06:28

Другие вопросы по теме