Работа с кавычками в строке, заключенной в кавычки - PullRequest
0 голосов
/ 04 декабря 2018

Возьмите этот CSV-файл:

ID,NAME,VALUE
1,Blah,100
2,"Has space",200
3,"Ends with quotes"",300
4,""Surrounded with quotes"",300

Он прекрасно загружается в большинстве статистических программ (R, SAS и т. Д.), Но в Excel третья строка неверно интерпретируется, поскольку имеет две кавычки.Экранирование последней цитаты как \" также не будет работать в Excel.Единственный способ, который я нашел до сих пор, - это заменить одну двойную кавычку двумя двойными кавычками:

ID,NAME,VALUE
1,Blah,100
2,"Has space",200
3,"Ends with quotes""",300
4,"""Surrounded with quotes""",300

Но это сделает файл совершенно бесполезным для всех других программ (R, SAS и т. Д.)

Есть ли способ отформатировать CSV-файл, в котором строки могут начинаться или заканчиваться теми же символами, которые использовались для их окружения, так, чтобы он работал в Excel, а также в обычно используемом статистическом программном обеспечении?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Ваше второе представление - это обычный способ создания файла CSV, поэтому с ним должно быть легко работать в любом программном обеспечении.См. Спецификации RFC 4180.https://www.ietf.org/rfc/rfc4180.txt

Таким образом, ваш второй пример представляет эти данные:

Obs    id    name                        value

 1      1    Blah                         100
 2      2    Has space                    200
 3      3    Ends with quotes"            300
 4      4    "Surrounded with quotes"     300

Если вы хотите представить его как файл с разделителями, где ни одно из значений не может содержать разделитель (в другихслова НЕ как стандартный файл CSV), чем это выглядело бы:

id,name,value
1,Blah,100
2,Has space,200
3,Ends with quotes",300
4,"Surrounded with quotes",300

Но если вы хотите, чтобы значения содержали разделитель, вам нужен какой-то способ отличить встроенные разделители от реальных разделителей.Таким образом, стандартные значения, которые содержат разделитель, должны быть заключены в кавычки.Но как только вы это сделаете, вам также необходимо добавить кавычки вокруг полей, которые содержат сам символ кавычки (и удвоить вложенные кавычки), чтобы избежать создания неоднозначного файла.Например, кавычки в 4-м наблюдении в вашем первом файле выглядят так, как будто они являются необязательными кавычками вокруг значения, а не части значения.

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

Но EXCEL позволяет встраивать символы конца строки в кавычки.Таким образом, в вашем исходном файле значение второго поля в третьем наблюдении выглядит так, как если бы вы добавили кавычки вокруг этого значения:

Ends with quotes",300
4,"Surrounded with quotes",300

Таким образом, вместо 4 полных наблюдений значений трех полейв каждом из них только три наблюдения, а последнее наблюдение имеет только два значения поля.

0 голосов
/ 04 декабря 2018

Это связано с тем, что управляющий символ для " в Excel равен "": Экранирование кавычек и разделителей в файлах CSV в Excel

Быстрый и простой способ обходаНа ум приходит R: сначала прочитать содержимое csv с readLines, затем заменить двойные (экранированные) двойные кавычки всего на одну двойную кавычку, а затем read.table:

read.table(
  text = gsub(pattern = "\"\"", "\"", readLines("data.csv")),
  sep = ",", 
  header = TRUE
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...