#r #readr
Вопрос:
TLDR: Как настроить Rstudio для импорта CSV в виде tibble точно так же, как Microsoft Excel (версия Rstudio для mac: Версия 1.3.959, Excel для mac: версия 16.33, если это поможет)? Если это невозможно или он уже должен вести себя так же, как я могу настроить его для чтения в CSV-файле, содержащем не более 8 столбцов, и заполнить пустые значения в строках, чтобы я мог привести его в порядок?
Длинная версия:
У меня есть десяток CSV-файлов (собранных из архивных тегов животных), которые беспорядочны (несогласованная ширина, несколько блоков данных в одном файле), и их нужно прочитать. По причинам рабочего процесса я хотел бы взять необработанные данные и перенести их прямо в R. Данные имеют согласованную структуру между файлами: блок метаданных, сводка по дням шириной 6 столбцов и 2 блока постоянного ведения журнала шириной 2 столбца. Если бы вы подсчитали пустые ячейки в каждом разделе, это было бы:
Раздел | Ширина | Длина |
---|---|---|
Метаданные | 8 | 37 |
Сводный блок | 7 | N дней |
Блок 1 | 2 | N*72 |
Блок 2 | 2 | N*72 |
Последние три блока данных могут содержать тысячи записей. Я не могу загрузить эти данные в R как что-либо другое,кроме одного фрейма данных 1×500 000 . Используя tag1 = read_csv («файл», skip = 37), чтобы просто начать с нужных мне данных, вылетает R. Он работает с read.csv(), но это удаляет блок метаданных, который я хотел бы сохранить.
Попытка прочитать файл в Excel показывает правильный формат (ширина, длина и т.д.), Но не загружает все данные. Это отрезает хороший кусок последнего блока данных. чтение данных в табличном формате, например read_xl (), представляет ту же проблему.
В конечном счете, мне нравится либо импортировать данные в виде вложенного фрагмента с этими различными разделами, либо, что еще лучше, автоматизировать этот процесс, чтобы он мог считывать csv-файлы во всей папке, автоматически присваивать их переменным и разбивать их на разделы. Однако сейчас я просто хочу перевести эти данные в работоспособный формат в целости и сохранности, и я был бы признателен за любую помощь, которую вы можете мне оказать.
Ответ №1:
Получите количество строк в файле, n, и из этого выведите N. Затем прочитайте блоки один за другим. Используйте одно и то же соединение, чтобы каждое чтение начиналось с того места, где заканчивалось предыдущее.
n lt;- length(count.fields("myfile", sep = "")) N = (n - 37) / (1 2 * 72) con lt;- file("myfile", open = "r") meta lt;- readLines(con, 37) summary_block lt;- read.csv(con, header = FALSE, nrow = N) block1 lt;- read.csv(con, header = FALSE, nrow = N * 37) block2 lt;- read.csv(con, header = FALSE, nrow = N * 37) close(con)
Комментарии:
1. Я работаю над реализацией этого, спасибо!