CSV-файл содержит данные со специальными символами, включая запятую (,), (\) и (""). Не удается создать df с правильным количеством столбцов? -Р-искровой - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть файл CSV, и я хочу создать фрейм данных с этим в py-spark, но не могу этого сделать, поскольку некоторые строки содержат данные со специальными символами, а половина его столбцов заключена в двойные кавычки. Ниже приведены данные и то, что я пробовал до сих пор.

sample_row

"ABG090D",2019-03-03 00:00:00.0000000,"A","some Data C\" AB01","Some Data","LOS","NEW",2019-04-11 00:00:00.0000000,"GHYTR","7860973478","0989","A",2019-03-03 00:00:00.0000000,"Y","N","N","N",1,"N","D016619",,"$,$#,&","Y",
"69901",,,,"FGF",89.00,"W",,"N","R","F",5.00,6.00,6.00,9.00,2.00,0,0,"9090",,"N",,,"1","N",,,"F",,2019-03-03 00:00:00.0000000,,,,,"N","A","N","N","N","N","N",,,,,,,"H",,,,,,,,,,"N","A","0","0","0",,0,0,0,0,0,0,0,"N","00","USA",
"C","I",0,,,,"FGF",0,,,"N","UOIU","5",,0,,0,0,,,"878","N",2019-04-11 09:44:00.0000000,"8980909","H",,,,"N","2","T","SomeData",
2020-03-12 09:24:52.0000000

В приведенных выше данных я сталкиваюсь с двумя основными проблемами:

1. "некоторые данные C \" AB01 " =>, поскольку они содержат backsla sh () и кавычки (") как часть данных.

2. "$, $ #, & " =>, поскольку он содержит запятую (,) как часть данных

df = spark.read.option("quote","\"").option("escape","\"").option("escape","\\").option("delimiter" , ",").option("ignoreLeadingWhiteSpace", "true").csv("/path/file.csv",customSchema)

С помощью приведенного выше кода я смог решить " некоторые данные C \ " AB01 ", но второй столбец ie. " $, $ #, & " создает здесь проблему.

Даже я пытался использовать ответ, приведенный ниже ссылка. Но это также не работает для меня. Как удалить двойные кавычки и дополнительный разделитель (и) с двойными кавычками файла TextQualifier в Scala

1 Ответ

0 голосов
/ 09 апреля 2020

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

Надеюсь, этот подход будет работать для вас.

import re

regex = r"(\"([^\"]+)\",?|([^,]+),?|,)"

test_str = "\"ABG090D\",2019-03-03 00:00:00.0000000,\"A\",\"some Data C\\\" AB01\",\"Some Data\",\"LOS\",\"NEW\",2019-04-11 00:00:00.0000000,\"GHYTR\",\"7860973478\",\"0989\",\"A\",2019-03-03 00:00:00.0000000,\"Y\",\"N\",\"N\",\"N\",1,\"N\",\"D016619\",,\"$,$#,&\",\"Y\", \"69901\",,,,\"FGF\",89.00,\"W\",,\"N\",\"R\",\"F\",5.00,6.00,6.00,9.00,2.00,0,0,\"9090\",,\"N\",,,\"1\",\"N\",,,\"F\",,2019-03-03 00:00:00.0000000,,,,,\"N\",\"A\",\"N\",\"N\",\"N\",\"N\",\"N\",,,,,,,\"H\",,,,,,,,,,\"N\",\"A\",\"0\",\"0\",\"0\",,0,0,0,0,0,0,0,\"N\",\"00\",\"USA\", \"C\",\"I\",0,,,,\"FGF\",0,,,\"N\",\"UOIU\",\"5\",,0,,0,0,,,\"878\",\"N\",2019-04-11 09:44:00.0000000,\"8980909\",\"H\",,,,\"N\",\"2\",\"T\",\"SomeData\", 2020-03-12 09:24:52.0000000"

matches = re.finditer(regex, test_str, re.MULTILINE)
values = []

for matchNum, match in enumerate(matches, start=1):
  if match.group(3) != None:
    values.append(match.group(3))
  elif match.group(2) != None:
    values.append(match.group(2))
  else:
    values.append(None)

print(values)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...