2016-04-29 5 views
12

Mam skrypt R, który tworzy plik tekstowy w systemie Windows.Jak pisać pliki z końcówkami linii Unix na R dla Windows

Używam zarówno funkcji write.table i write do zapisu w pliku.

Potrzebuję wtedy użyć tego pliku na systemach Unix, ale plik ma znaki końca wiersza systemu Windows (^ M).

Czy można pisać pliki z R w systemie Windows, które mają znaki końca linii na Unixie?

Edit

Oto powtarzalne przykład:

output.file <- file.path("./test.txt") 

x <- c(1,2,3,4) 
y <- c(5,6,7,8) 
my.df <- data.frame(x, y) 
my.df[] <- lapply(my.df, sprintf, fmt = "%14.7E") 

write("First line", file = output.file) 
write("Second line", file = output.file, append = TRUE) 
write.table(my.df, 
      row.names = FALSE, 
      col.names = FALSE, 
      file = output.file, 
      quote = FALSE, 
      append = TRUE, 
      sep = "") 

A wynik, jak widać przez Notepad ++:

enter image description here

+0

Zobacz 'eol' argumentu dla' write.table' – Raad

+0

Domyślnie eol argumentem jest ustawiony na \ n, więc powinien już działać. Ponadto używam zarówno funkcji write(), jak i write.table(). W zapisie nie ma parametru eol, dodaję \ n ręcznie. Nadal mam^M podczas czytania z Uniksem – Ben

Odpowiedz

10

Jak stwierdzono w help(write.table):

Aby napisać plik w stylu Unix w systemie Windows, użyj połączenia binarnego, np. file = file ("filename", "wb").

W przykładzie, wystarczy zmienić pierwszą linię otworzyć plik "wb" połączenia i close na końcu:

output.file <- file("./test.txt", "wb") 

x <- c(1,2,3,4) 
y <- c(5,6,7,8) 
my.df <- data.frame(x, y) 
my.df[] <- lapply(my.df, sprintf, fmt = "%14.7E") 

write("First line", file = output.file) 
write("Second line", file = output.file, append = TRUE) 
write.table(my.df, 
      row.names = FALSE, 
      col.names = FALSE, 
      file = output.file, 
      quote = FALSE, 
      append = TRUE, 
      sep = "") 

close(output.file) 

enter image description here

2

UNIX zakończeń typu linii można osiągnąć za pomocą wb zapis | tryb binarny w połączeniach plików.

Ten cytat z artykułu rnews mogą być pomocne: Ripley, B. D. (2001) Connections. R News, 1/1, 16–7.

Tekst vs binarnym Istnieje różnica między trybie tekstowym i binarnym połączeń trybu. Intencją jest to, że funkcje tekstowe, takie jak skanowanie i cat, powinny wykorzystywać połączenia w trybie tekstowym, a tryb binarny jest używany z readBin i writeBin. To rozróżnienie nie jest jeszcze konsekwentnie wymuszane, a główną różnicą jest to, czy pliki są otwarte w trybie tekstowym lub binarnym (gdzie to ma znaczenie). Teraz wygląda na to, że otwierając wszystkie pliki w trybie binarnym i zarządzając tłumaczeniem zakończeń linii wewnątrz R, spowoduje to mniej niespodzianek. Już czytanie z połączenia w trybie tekstowym tłumaczy zakończenia linii z Uniksa (LF), DOS/Windows (CRLF) i Macintosh (CR) (i ze wszystkich połączeń , a nie tylko plików).

# setup file connection 
con <- file(output.file) 

# open connection 
if(!isOpen(con = con, rw = "wb")) { open(con, open = "wb") } 

# write contents 
write(x = paste(colnames(my.df), collapse = "\t"), file = con) 
for(i in 1:nrow(my.df)){ 
    write(paste(my.df[i, ], collapse = "\t"), file = con) 
} 
close(con) # close and destroy a connection 

# verify file contents 
read.table(output.file, header = TRUE, sep = "\t") 
# x y 
# 1 1 5 
# 2 2 6 
# 3 3 7 
# 4 4 8 
Powiązane problemy