R код для открытия файлов один за другим, выполнения операций и закрытия открытого файла. - PullRequest
0 голосов
/ 30 марта 2020

Я работаю в R Studio.

У меня ~ 50 текстовых файлов, все из которых имеют данные в одинаковом формате (14 столбцов в том же порядке). Каждый файл большой (~ 100 МБ). У меня все файлы сохранены в одной папке. Для этого нужно написать код R, чтобы я мог открыть один файл, выполнить некоторые операции, записать вывод в целевой файл и закрыть файл. После этого мне нужно следить за процессом для остальных файлов. Я хотел автоматизировать процесс, но не знал, как поступить так же. Пробовал поиск, но не смог найти то, что я мог бы применить.

Я сделал это для одного файла, но не уверен в коде, который может помочь мне автоматизировать процесс для 50 файлов. Запрос помощи .....

library(data.table)
library(dplyr)
library(tidyverse)

#### Opening One File
myfile=fread("C:/Users/shegu/Desktop/LOB30SCRIP_010318.txt", 
sep="|",header=FALSE, stringsAsFactors = TRUE)

#### Renaming cols
colnames(myfile) <- c("Trading_Session", "Scrip_Code", "Buy_Sell", 
        "Order_Type", "Rate_in_Paise", "Quantity","Avl_Quantity", "Order_Time_Stamp", 
        "Retention", "AUD_Code", "Order_ID", "Action_ID", "Error_Code","ALGO_Flag")

#### Changing Format of cols

myfile$Order_Time_Stamp=as.Date(myfile$Order_Time_Stamp, "%Y-%m-%d %H:%M:%S")
myfile$Scrip_Code=as.factor(myfile$Scrip_Code)
myfile$Order_ID=as.factor(myfile$Order_ID)

#### Performing Group-by operation (this needs to be done on each file in my folder)

myfile_by_AUD_Code=myfile%>%
    group_by(Scrip_Code,ALGO_Flag,AUD_Code)%>%
    summarise(n())

#### Writing results to target file (need results for all files in this target file)
       write.csv(myfile_by_AUD_Code,"C:/Users/shegu/Desktop/BSE_Data/Target.csv", 
       row.names = FALSE)

1 Ответ

0 голосов
/ 30 марта 2020

У вас есть большинство шагов. Вам просто нужно обобщить их с помощью функции, применяемой ко всем файлам в каталоге. Я предлагаю вам следующее. Кстати, вы загружаете слишком много пакетов: поскольку вы используете fread, придерживайтесь подхода data.table.

library(data.table)

files <- list.files("C:/Users/shegu/Desktop/",
                    full.names = TRUE, pattern = ".csv")


clean_file <- function(filename){

  data <- fread(filename, sep="|",header=FALSE, stringsAsFactors = TRUE)

  #### Renaming cols
  data.table::setnames(data, new = c("Trading_Session", "Scrip_Code", "Buy_Sell", 
                               "Order_Type", "Rate_in_Paise", "Quantity","Avl_Quantity", "Order_Time_Stamp", 
                               "Retention", "AUD_Code", "Order_ID", "Action_ID", "Error_Code","ALGO_Flag"),
                       old = colnames(data)
  )

  data[, Order_Time_Stamp := as.Date(Order_Time_Stamp, "%Y-%m-%d %H:%M:%S")]
  data[, Scrip_Code := as.factor(Scrip_Code)]
  data[, Order_ID := as.factor(Order_ID)]

  #### Performing Group-by operation (this needs to be done on each file in my folder)
  myfile_by_AUD_Code <- data[, .(nobs = .N) ,by = c("Scrip_Code","ALGO_Flag","AUD_Code")]

  ### Write file
  fwrite(myfile_by_AUD_Code, gsub(".csv","_summary.csv",filename))

  return(NULL)  
}

lapply(files,clean_file)

имена файлов определяются с помощью функции list.files. Я добавляю аргумент шаблона, чтобы обеспечить перечисление только csv файлов. Добавьте другие элементы, если в вашем каталоге есть файлы, которые вы не хотите читать.

Я предложил вам записать файлы как old_filename_summary.csv Измените эту строку, если она вам не подходит.

Остальное - просто трагедия в data.table вашего примера

...