Как прочитать несколько файлов из папки, объединить данные в один файл и добавить переменную с именами исходных файлов? - PullRequest
0 голосов
/ 31 октября 2019

У меня есть папка с 80 файлами журналов, и их имена - это годы, в которые они были созданы (пример 2008P1.log, 2008P2.log, 2009P1.log и т. Д.). Каждый файл имеет один столбец данных с более чем 100000 строк. Я хочу поместить все эти данные в один файл в последовательности их названий (по годам).

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

Также мне нужен дополнительный столбец в новом файле с именем файла, из которого они были взяты.

Мне нужно сделать это с Python или R.

Файлы:

2008
2008P1
2008p2
2009P1
2009p3
.
.
.
.
.
2019P3

Данные в файле:

$h|fffff|P|....
$C|fffff|P|....
.
.
.
.
.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

В базе R следующее может быть тем, что вы хотите. Протестировано с 3 файлами с именами и данными, которые вы опубликовали.

filenames <- list.files(pattern = "^[[:digit:]]{4}.*\\.log$")
filenames <- filenames[order(toupper(filenames))]
df_list <- lapply(filenames, read.table)
df_list <- lapply(seq_along(filenames), function(i){
  df_list[[i]]$file <- filenames[i]
  df_list[[i]]
})

outfile <- "outfile.txt"
write.table(df_list[[1]], outfile, quote = FALSE, 
            row.names = FALSE, col.names = FALSE)
lapply(df_list[-1], function(DF){
  write.table(DF, outfile, 
              append = TRUE, quote = FALSE, 
              row.names = FALSE, col.names = FALSE)
})
0 голосов
/ 31 октября 2019

Я повторяю комментарий @ RuiBarradas о том, что непросто понять, как выглядят ваши файлы журналов.

Поскольку вы упоминаете столбец, я представляю, что разделители - это разрывы строк. Я также сделал предположение, что эти столбцы не имеют заголовков. Если любое из этих предположений неверно, вам придется поиграть с аргументами read.table() или использовать вместо read.delim().

Вот предложение:

library(dplyr)
library(purrr)

# Make a list of your files
files <- list.files(path = "/your/folder/path", pattern = "\\d{4}[Pp]?\\d?\\.log")

# Create a function to read a file and create your new variable
read_file_and_create_col <- function(file) {
  read.table(file, stringsAsFactors = F) %>% 
    mutate(name = sub(".*/(.*)\\.log", "\\1", file))
}

# Apply it to each file and output to a data frame
map_df(files, read_file_and_create_col)

Порядок долженбудь как ты хочешь по умолчанию. Если по какой-то причине это не так, вы можете заказать новый файл, добавив %>% arrange(name) к последней строке кода.

...