Создайте строку с характерными для ОС символами новой строки (CRLF, LF, CR), чтобы записать ее в столбец таблицы базы данных.

Я хочу написать строку, содержащую обычный символ новой строки R (\n), в столбец таблицы базы данных.

Как я могу преобразовать новую строку в конкретное представление операционной системы (Windows = CR/LF, Linux = LF, Mac = CR...)?

Я узнал, что R не обеспечивает конкретное представление операционной системы, поэтому мне нужно найти обходной путь:

Любая попытка напечатать/убрать строку не удалась:

msg <- "I want to have \n a new line"
cat(msg)
# I want to have 
#  a new line

out <- capture.output(cat(msg))
out
# a vector with two elements (one for each row but no new line characters anymore)
# [1] "I want to have " " a new line"

paste(out, collapse = "\n")   # how could I inject the correct new line characters here?
# [1] "I want to have \n a new line"

# welcome endless-loop :-)

Есть ли способ позволить R создавать правильные символы новой строки из \n в строке?

PS: я играю со встроенным пакетом tcltk и puts, но я всегда заканчиваю R, «преобразовывающим» новую строку в \n... Другой «обман» может состоять в том, чтобы заключить \n в кавычки, чтобы читать его, как будто это были одной линией. Я пока понятия не имею, как это может работать...


person R Yoda    schedule 24.11.2017    source источник


Ответы (2)


Один из способов правильно установить новый код строки в R — это запросить операционную систему. Поскольку и OS X, и Linux ведут себя одинаково, нужно определить, является ли операционная система Windows. Один из способов сделать это — опросить переменную окружения OS следующим образом.

if(substr(Sys.getenv("OS"),1,7) == "Windows") {
    # set Windows newline
  newLine <- "\r\n"
}
else {
    # set non-Windows newline
    newLine <- "\n"
}

Затем используйте paste() с объектом newLine, чтобы сгенерировать правильные символы для новой строки операционной системой.

paste("my text string on a line",newline,sep="")

С уважением,

Лен

person Len Greski    schedule 25.11.2017
comment
На самом деле это мой текущий обходной путь (с использованием Sys.info()), и я ожидал, что R предоставляет такую ​​​​функциональность OOTB, поскольку он может правильно обрабатывать это внутри. - person R Yoda; 25.11.2017
comment
@RYoda - это одна из особенностей R как продукта с открытым исходным кодом. Иногда очевидные функции не реализованы. - person Len Greski; 25.11.2017
comment
Я только что принял ваш ответ, но позже опубликую свое личное решение как отдельный ответ, в котором используется немного другой подход. СПАСИБО еще раз! - person R Yoda; 28.11.2017

Здесь вы найдете мою окончательную реализацию как возможную альтернативу принятому ответу:

# Returns the operating system specific new line character(s):
# CR LF on Windows, else only LF...
# Simlar to Microsofts .Net "Environment.NewLine"
platform.NewLine <- function() {

  is.windows <- grepl(tolower(.Platform$OS.type), "windows", fixed = TRUE)

  if (is.windows) {
    newline <- "\r\n"
  } else {
    newline <- "\n"
  }

  sys.name <- Sys.info()["sysname"]
  is.windows.2nd.opinion <- grepl(tolower(sys.name), "windows", fixed = TRUE)

  if (is.windows != is.windows.2nd.opinion)
    warning("R seems to run on Windows OS but this could not be recognized for sure")

  return(newline)
}

# Usage (examples) ------------------------------------------------------------------------------------------------

newline <- platform.NewLine()

# "print" shows the "symbolic" names (escape codes)
print(paste("Line1", "Line2", sep = newline))
# [1] "Line1\r\nLine2"
# uses "\n" or "\r\n" depending on your OS

# "cat" applies the newline escape codes to the output
cat(paste("Line1", "Line2", sep = newline))
# Line1
# Line2
person R Yoda    schedule 29.11.2017