R .csv неправильно прочитан, потому что в тексте есть двойные кавычки - PullRequest
0 голосов
/ 03 июня 2019

У меня есть файл .csv, который содержит все текстовые поля.Однако некоторые текстовые поля содержат неэкранированный символ двойной кавычки, например:

"ID","Text","Optional text","Date" 
"1","Today is going to be a good day","","2013-02-03"
"2","And I am inspired by the quote "every dog must have it's day"","Hi","2013-01-01"
"3","Did not the bard say All the World's a stage" this quote is so true","Terrible","2013-05-05"

Строки 1 и 2 в порядке, но 3 не читается правильно.В данный момент я вручную просматриваю файл в Notepad ++, чтобы попытаться удалить такие цитаты.В идеале я хотел бы, чтобы R был в состоянии справиться с этим, но я думаю, что неугасленная природа непревзойденной двойной кавычки делает такое ожидание необоснованным.

В Notepad ++ я пытаюсь создать регулярное выражение для определения двойных кавычек, которым не предшествует запятая или за ней не следует.Логика заключается в том, что допустимая двойная кавычка будет в начале или конце поля, и это обозначается соседней запятой.Это может помочь выявить большинство моих дел, с которыми я затем смогу разобраться.

Просто скажу, что у меня около 3,4 миллиона записей и около 0,1% кажется проблематичным.

РЕДАКТИРОВАТЬ: в качестве альтернативы был предложен fread из data.table, но использование freadеще менее удачно:

1: In fread(paste(infilename, "1", ".csv", sep = "")) :
  Stopped early on line 21. Expected 18 fields but found 9. Consider fill=TRUE and comment.char=. First discarded non-empty line

Нет предложенных вариантов работает.Я думаю, это потому, что поле «Текст» также может содержать символы CRLF.Read.csv, кажется, просто игнорирует это (хорошо), в то время как fread принимает исключение.Извините, что я не могу сделать фактический текст доступным, но вот некоторые более полные тестовые данные, которые имеют как непревзойденные двойные кавычки (с read.csv есть проблемы), так и CRLF (с фредом есть проблемы).

"ID","Text","Optional text","Date" 
"1","Today is going to be a good day","","2013-02-03"
"2","And I am inspired by the quote "every dog must have it's day"","Hi","2013-01-01"
"3","An issue with this line is that it contains a CRLF here 
which is not usual.","Again an unusual CRLF
is present in these data","2013-02-02"
"4","Did not the bard say All the World's a stage" this quote is so true","Terrible","2013-05-05"

Было бы здорово помочь с регулярным выражением в Notepad ++.

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Возможно, одним из вариантов может быть использование условной замены в notepad ++.

Вы можете найти все строки, которые начинаются с двойной кавычки, которые начинаются с запятой или в начале строки.

Затем не ставьте двойные кавычки, пока не встретите следующую двойную кавычку, за которой следует запятая или конец строки.Эти белые линии в порядке, поэтому для чередующейся части, которую вы хотите захватить и заменить, сопоставьте двойную кавычку, а не запятую.

Найдите что:

(?:^|,)"[^"\n]*"(?=$|,)|(?<!,)(")(?!,)

Заменить на:

Условная замена.Если группа 1, то заменить на пустое, иначе заменить на совпадение.

(?{1}:$0)

Regex demo

Объяснение

  • (?:^|,) Сопоставьте запятую или укажите начало строки
  • "[^"\n]*" Сопоставьте двойные кавычки, если между ними нет 1032 *
  • (?=$|,) Подтвердите, чтосправа находится либо конец строки, либо запятая
  • | ИЛИ
  • (?<!,)(")(?!,) Захватите двойную кавычку в group1, утверждая, что слева и справане запятая
1 голос
/ 03 июня 2019

Кажется, довольно хорошо работает с data.table::fread:

fread("E:/temp/test.txt")
#   ID                                                                 Text Optional text     "Date"
#1:  1                                      Today is going to be a good day               2013-02-03
#2:  2        And I am inspired by the quote "every dog must have it's day"            Hi 2013-01-01
#3:  3 Did not the bard say "All the World's a stage" this quote is so true      Terrible 2013-05-05
#Warning message:
#In fread("E:/temp/test.txt") :
#  Found and resolved improper quoting in first 100 rows. If the fields are not quoted (e.g. field separator does not appear within any field), try quote="" to avoid this warning.
...