Создайте файл .tar.gz из сериализованной строки содержимого с помощью R - PullRequest
0 голосов
/ 31 мая 2018

Имея файл .tar.gz на моем жестком диске, я хотел бы создать этот точный файл, но только с кодом R (например, с помощью сериализации).Цель состоит не в том, чтобы обратиться к самому файлу, а в том, чтобы создать текстовую переменную, содержащую содержимое файла, и после этого записать файл в файловую систему.Я подумал о следующем:

  1. Взять строку base64 файла (сериализация base64).
  2. Записать ее в файловую систему в виде двоичного файла.

Но следующий код генерирует пустой файл:

zzfil <- tempfile("testfile")
zz <- file(zzfil, "wb")
file_content <- "H4sIAAAAAAAAA+1YbW/bNhD2Z/6KW/zBNpLIerHjQmvapo6HBWgyw3ZXDE1X0BJtEZFIgaTguEb/+06S7drJumJA5m6DHsAQxOM9PPF4uscyTJuUBnd0zmzbaV8Oxv3R1XBy9ctN7clgI846nfzq9Lr27rVAr2fXHM+zvV6303N6NdvxHDSDXTsAMm2owlDE/K/nfcv+H8WwzL0PZu8gkMkyxcG1lUy4ifH2XUQNmIhtxuFSMg3Nwgp9qlmL/MqU5lL4YFuOZZOLzERS5Z4SFkoaBtyQa8qFwR9DwwTZ1stCsh2H50uZKc3i2SstE7aImGKWYOYFuWQ6UDw1xRrXUjGgU5kZWOShcQNhEVFCl1Pky80mogKkYBAjcYsA4q1mMEN+0LgyTkd6AVyETBgu5hiOonNF0wgt3ERcFI+8s7BF3vCACb3Zkbi8A67zCDIkUi/JQAQyRDof3k5+On2GgadMhNqHETRfnINndSyvRa6SVCqDo/N5GkvjFjbXci2ndQKGT6e4sfmQg9PdFnlDPy0vqaGYLpUxcsNYqPsySXlMyx0RkqxzE/rg2s6zU7t76jngOL7T870uBtP/EcScbPK/n/b2zcX1YDy86A+e8ox9q/6x8Mv6d92eZztY/+6Z163q/xBg9/kBHFJjmBLNo9/fv/dpnEbU//Dh+KhFahX+33hQ/6P2P7BG0eO73a/Xv20/qH/nDGUAdKv6P3z+IxbH0hod8P2P2T5b59/zOo6d6z+706ve/4dAHX7OE34CC6ni8AdSJ3XUZLmS0YDCid3TJEUNMstEkCsMEDRhITSKU9LAuYuIBxGkCpWbhsYeV8Mq2H6TGQRIFTOqRKnJSsm2kX200Ii58srlFozGJgu5BGr8wh8gMib12211mt7NtRXR0AqkJT61C/MY9SFkms2yGO7YciqpCkEjoQkyDGkm1eOFNsSvMx6H+JghjFgsaQhbNQyNvlExHMM44jOD19eNwqMfseBuZ9oOHnoMSo8JFtifOzzymDQIqTfgVdmTSbHH8Px0u/nNFqxQwBab3Tza22ts1Z8fO3/Mq3ufISeI+VRRtWyuNWfrC+eV3gpRLrAw4piFL4+KCTlNaWuGqEDPExNQpU+AMt28P0/SeaucdgxzJpOPeISMRBWdYNBQh5DNaBYbmCItRlr13X/p+z+h4ukVwN/v/67Tc6r+/53yv1YA4cH+/7mP8u91u17V/w+B27yhr4qUfya3NOZUb+9M/l1nte4z74o+g6OZxrOyKhtMM287t+GXTyMrMvyKFMB5azGhd52rN3CFChUqfB/8AQr6tbUAGgAA"
writeBin(RCurl::base64Decode(file_content), zz)
close(zz)
file.rename(from = zzfil, to = paste0(zzfil,".tar.gz")) 

Как вместо этого сериализовать файл?Т.е. как мне заполнить функции file_to_string и string_to_file?

file_to_string <- function(input_file){
  # Return a serialized string of input_file

}

string_to_file <- function(input_string){
  # Return content to write to a file

}

original_file <- "original.tar.gz"
zzfil <- tempfile("copy")
zz <- file(zzfil, "wb")
file_content <- file_to_string(original_file)
writeBin(string_to_file(file_content), zz)
close(zz)
file.rename(from = zzfil, to = paste0(zzfil,".tar.gz"))

1 Ответ

0 голосов
/ 07 июня 2018

Для меня, используя R 3.4.4 на платформе x86_64-pc-linux-gnu, RCurl версии 1.95-4.10, пример кода создает непустой файл, который может быть прочитан обратно при использовании readBin, поэтому я могуне воспроизводит проблему с пустым файлом.

Но это не главная проблема.
Использование writeBin не дает того, что вы хотите сделать: это вариант использования для хранения R-объекта (avector) в двоичном формате в файловой системе и считайте его обратно с помощью readBin;не читать в двоичном файле, затем манипулировать им и сохранять новую версию или генерировать двоичный файл, который должен понимать любой другой объект, кроме readBin.

По моему скромному мнению: R, вероятно, неправильный инструмент для создания бинарных патчей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...