экспортировать и импортировать данные, когда какая-либо строковая переменная внедряет новую строку

Предположим, у меня есть переменная s с этим кодом:

s <- "foo\nbar"

Затем измените его на data.frame

s2 <- data.frame(s)

Теперь s2 - это data.frame с одной записью, затем я экспортирую в файл csv с:

write.csv(s2, file = "out.csv", row.names = F)

Потом открываю блокнотом, "foo\nbar" разлетелся на две строчки. С импортом SAS:

proc import datafile = "out.csv" out = out dbms = csv replace;
run;

У меня две записи, одна "foo", другая "bar", что не ожидается.

Поборовшись некоторое время, я обнаружил, что могу ли я экспортировать из R с помощью иностранного пакета, например:

write.dbf(s2, 'out.dbf')

Затем импортируйте с помощью SAS:

proc import datafile = "out.dbf" out = out dbms = dbf replace;
run;

Все работает хорошо и получил одну запись в sas, значение похоже на «foo bar». Означает ли это, что csv — плохой выбор при работе с данными по сравнению с dbf? Есть ли другие решения или объяснения этому?


person DaJun Tian    schedule 04.02.2015    source источник


Ответы (3)


Файл CSV означает версию с разделителями-запятыми. Это означает, что каждая строка в файле должна содержать список значений, разделенных запятой. SAS правильно импортировал файл на основе определения файла CSV (т. е. 2 строки = 2 строки).

Проблема, с которой вы столкнулись, связана с \n символами в вашей строке. Эта последовательность символов представляет собой символ новой строки, и именно поэтому вызов R write.csv() создает две строки вместо того, чтобы помещать их все в одну.

Я не эксперт в R, поэтому я не могу сказать вам, как изменить вызов write.csv() или замаскировать значение \n во входной строке, чтобы предотвратить запись символа новой строки.

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

person Robert Penridge    schedule 04.02.2015

DBF - это форматы баз данных, с которыми всегда проще работать, потому что в их структуру встроены переменные типы/длины.

С CSV или любым другим файлом с разделителями у вас должна быть включена документация, чтобы знать структуру файла.

Преимущество CSV заключается в меньшем размере файлов и совместимости с несколькими ОС и приложениями. Например, какое-то время Excel (2007?) Больше не поддерживал DBF.

person Reeza    schedule 04.02.2015
comment
Если вы настаиваете на использовании CSV-файла, как упомянул Роберт, маскирование специальных символов, таких как «\ n», может быть обходным путем. CSV действительно удобен, чтобы быстро посмотреть, как выглядят данные. Я всегда расстраивался, когда имел дело с бесплатными текстами. Если данные действительно большие, я думаю, RSqllite также может быть выбором. - person DaJun Tian; 04.02.2015

Как говорит Роберт, вам нужно будет замаскировать новое значение строки. Например:

replace_linebreak <- function(x,...){
  gsub('\n','|n',x)
}   

s3 <- replace_linebreak(s2$s)

Это заменяет \n на |n, которое затем нужно будет заменить при повторном импорте. Очевидно, что то, что вы решите замаскировать, будет зависеть от ваших данных.

person Zfunk    schedule 04.02.2015