В поле с длинными числами нет строки цифр из-за Excel. Excel Office Professional 2013 преобразует цифры в округленное число

Я читаю CSV файл в R, который содержит столбец идентификатора конверсии. Проблема, с которой я сталкиваюсь, заключается в том, что мой идентификатор обращения округляется как экспоненциальный номер. Ниже приведен снимок CSV файла (открыт в Excel), который я читаю в R. Как вы можете видеть, идентификатор преобразования является экспоненциальным, но это значение: 383305820480.

Когда я прочитал данные в R, используя следующие строки, я получил следующий вывод. Похоже, что он округляет строку идентификаторов конверсий.

x<-read.csv("./Test2.csv")
options("scipen"=100, "digits"=15)
x

Когда я экспортирую файл как CSV, используя код

write.csv(x,"./Test3.csv")

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

Я также пробовал читать файл как фактор, используя код, но я получаю тот же вывод с округленными числами. Мне нужно, чтобы Conversion.ID был уникальным идентификатором.

x<-read.csv("./Test2.csv", colClasses="character")

Единственный способ заставить столбец идентификатора конверсии оставаться уникальным идентификатором - открыть файл CSV и написать "перед каждым идентификатором конверсии". Это не масштабируется, потому что у меня есть сотни файлов.

2 ответа

Я не могу повторить ваш опыт.

(Обновление: OP сообщает, что проблема заключается в том, что Excel конвертирует/округляет данные по импорту [!!!])

Я создал файл на диске с полной точностью (я не знаю наименее значимых цифр ваших данных, вы не показывали их, кроме первого элемента, но я помещал ненулевое значение в место единиц для иллюстрации ):

writeLines(c(
 "Conversion ID",
 " 383305820480",
 " 39634500000002",
 " 213905000000002",
 "1016890000000002",
 "1220910000000002"),
 con="Test2.csv")

Прочитайте файл и распечатайте его с полной точностью (используйте check.names=FALSE для идеальной возможности "туда и обратно" - не то, что вы хотите делать на регулярной основе):

x <- read.csv("Test2.csv",check.names=FALSE)
options(scipen=100)
print(x,digits=20)
## Conversion ID
## 1 383305820480
## 2 39634500000002
## 3 213905000000002
## 4 1016890000000002
## 5 1220910000000002

В порядке.

Теперь напишите вывод (используйте row.names=FALSE чтобы не добавлять имена строк/разрешать чистую поездку туда и обратно):

write.csv(x,"Test3.csv",row.names=FALSE,quote=FALSE)

Наименее опосредствованным способом проверки файла на диске из R является file.show():

file.show("Test3.csv")
## Conversion ID
## 383305820480
## 39634500000002
## 213905000000002
## 1016890000000002
## 1220910000000002

x3 <- read.csv("Test3.csv",check.names=FALSE)
all.equal(x,x3) ## TRUE

Используйте системные инструменты для проверки того, что файлы одинаковые (за исключением различий в пробелах - исходный файл был правным):

system("diff -w Test2.csv Test3.csv") ## no difference

Если у вас еще больше строк ID, вам нужно будет прочитать их как символ, чтобы избежать потери точности:

read.csv("Test2.csv",colClasses="character")
## Conversion.ID
## 1 383305820480
## 2 39634500000002
## 3 213905000000002
## 4 1016890000000002
## 5 1220910000000002

Возможно, вы могли бы безопасно обойтись через Excel (если вы все еще думаете, что это хорошая идея), импортируя в качестве символа и экспортируя с кавычками для защиты значений.


Я только разобрался в этом вопросе. Похоже, моя версия Excel преобразует данные, заставляя их потерять цифры. Если я не открою файл в Excel после его загрузки, он сохранит все цифры. Я не уверен, что это известная проблема с более новой версией. Я использую Excel Office Professional Plus 2013.

licensed under cc by-sa 3.0 with attribution.