Разобрать многострочный CSV с помощью PySpark, Python или Shell

Ввод (2 столбца):

col1 , col2
David, 100
"Ronald
Sr, Ron , Ram" , 200
Harry
potter
jr" , 200
Prof.
Snape" , 100

Примечание. У Гарри и Проф. нет начальных кавычек.

Вывод (2 столбца)

col1 | col2
David | 100
Ronald Sr , Ron , Ram| 200
Harry potter jr| 200 
Prof. Snape| 100

Что я пробовал (PySpark)?

df = spark.read.format("csv").option("header",True).option("multiLine",True).option("escape","\'")

Проблема Вышеупомянутый код работал нормально, когда многострочный текст имел начальную и конечную двойные кавычки (например, строка, начинающаяся с Рональда)

Но это не работало со строками, где у нас есть только конечные кавычки, но нет начальных кавычек (например, Гарри и Проф).

Даже если мы добавим стартовые кавычки с Гарри и Профом, это решит проблему.

Любая идея с использованием Pyspark, Python или Shell и т. д. приветствуется!

Может ли ваш ввод содержать | символов?

Ed Morton 17.05.2022 03:49

@EdMorton Нет - данные не должны содержать «|» (трубка)

Debaditya 17.05.2022 03:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На основании предоставленной небольшой выборки:

  • удалить все двойные кавычки
  • есть два поля, разделенных запятыми; 1-е поле — строка, 2-е поле — число
  • 1-е поле может содержать запятые и может быть разбито на несколько строк
  • замените запятую на вертикальную черту (|)
  • Ожидаемый результат OP не соответствует расстоянию перед вновь вставленной трубой (|); иногда пробел убирается, иногда ставится пробел; пока мы не будем беспокоиться о интервалах

Одна awk идея:

awk -F, '
             { gsub(/"/,"") }                      # remove double quotes
FNR==1 ||                                          # if 1st line or last field is a number then ...
($NF+0)==$NF { print prev gensub(FS,"|",(NF-1))    # print any previous line(s) data plus current line, replacing last comma with a pipe
               prev = ""                             # clear previous line(s) data
               next                                # skip to next line of input
             }
             { prev= prev $0 " " }                 # if we get here then this is a broken line so save contents for later printing
' sample.csv

Это генерирует:

col1 | col2
David| 100
Ronald Sr, Ron , Ram | 200
Harry potter jr | 200
Prof. Snape | 100

Извиняюсь за мой первоначальный вопрос. Я изменил ввод/вывод. На самом деле, у меня есть "запятая" всякий раз, когда строка начинается с двойных кавычек...

Debaditya 17.05.2022 04:15

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