рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ

рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг + рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрд╢рд▓ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛, рдЬреЛ рдЕрднреНрдпрд╛рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд╛рд╕рд┐рд▓ рдХреА рдЬрд╛рддреА рд╣реИ, рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдврдВрдЧ рд╕реЗ рдХрдИ "рдЬреИрд╕реЗ" atypical рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдиреАрдЪреЗ рдХреБрдЫ рдРрд╕реЗ рд╣реА рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдХрдИ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдпрд╣ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рд┐рд▓рд╕рд┐рд▓рд╛ рд╣реИред


рдЖрд╡реЗрджрди рд▓реЙрдЧ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕


рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЙрдЧ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рддреНрдордХ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдФрд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рди рд╕рдВрдХреЗрддрдХреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ, рдпрд╛ рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдЖрдк рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдИрдПрд▓рдХреЗ рд╕реНрдЯреИрдХ рдпрд╛ рдЬреИрд╕реЗ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╕реНрдкреНрд▓рдВрдХ рд░реВрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдмрд╛рд╣рд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдЖрдк рдереЛрдбрд╝рд╛ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдЖрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд░ рддрд░рд╣ рд╕реЗ, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рджреЛрдиреЛрдВ рдореЗрдВред


рд▓реЗрдХрд┐рди рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп рдХрдИ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:


  1. рдЖрдорддреМрд░ рдкрд░, рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЗрдВ рдХреНрд▓рд╛рд╕рд┐рдХ log4j рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд▓рд┐рдЦреА рдЬрд╛рддреА рд╣реИрдВ: рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рдорд╣рддреНрд╡, рдЙрдк-рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдкреНрд░рдХрд╛рд░, рд╕рдВрджреЗрд╢ рд╢рд░реАрд░ред
  2. рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рдПрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╡рд╛рд▓реА рдШрдЯрдирд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдмрд╛рдж рдХреЗ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Milliseconds ISO 8601 рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд┐рдП рдмрд┐рдирд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддрд╛ рд╣реИред
  3. рд╕рдВрджреЗрд╢ рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрд░рдЪрд┐рдд рдЗрдХрд╛рдИ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рдм рдХреБрдЫ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗ рд╡рд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХ рд╕рдордЭрддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рд╕реНрддреБрддрд┐ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ред
  4. рдХрднреА-рдХрднреА рд╕рдВрджреЗрд╢ рдирд┐рдХрд╛рдп рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд╣реЛрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╛рд╡рд╛ рдХреЙрд▓ рд╕реНрдЯреИрдХ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ, рдпрд╛ рдПрдХреНрд╕рдПрдордПрд▓ рдЪреМрд░рд╛рд╣рд╛ рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкреИрдХреЗрдЬред рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЛ рдПрдХ рдореЗрдВ рд╕рдореЗрдЯрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ (рдПрдХ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдорд╛рд░реНрдХрд░ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ)ред
  5. рдПрдЯреНрд░рд┐рдЕрдЯреНрд╕ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд╛рдо рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдИрдбреА рдХреЛ рдПрдиреНрдХреЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
  6. рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХрдИ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдпрд╛ рд╕реИрдХрдбрд╝реЛрдВ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
  7. рдХрд╛рд░реНрдп рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЛ 2 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:


  • рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ;
  • рдмрд╛рдж рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдгред

рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреА рд╕рд╛рдордЧреНрд░реА рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдЖрд░ рдЗрд╕ рдХрджрдо рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓рд╛ рдХрджрдо рднреА рдЖрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓реЙрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрд░рд╛рдмрд╛рдЗрдЯреНрд╕ рдПрдХ рдпрд╛ рджреЛ рдкреАрд╕ рд▓реЗрдВред


рдмрд╕ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб:
 library(readr) library(tidyverse) library(magrittr) library(stringi) library(fs) library(glue) library(RClickhouse) library(DBI) library(anytime) library(tictoc) library(iterators) library(foreach) library(doParallel) library(futile.logger) library(re2r) library(data.table) library(future) library(doFuture) common_logname <- "DEV_log_parser.log" table_name <- "DEV_LOGS" flog.appender(appender.file(common_logname)) flog.threshold(INFO) flog.info("Start batch processing") oneTimeProcessing <- function(f_iter, log_type = c("app", "system")) { log_type <- match.arg(log_type) checkmate::assertNames(names(f_iter), permutation.of = c("fname", "short_fname", "location", "wk", "size", "id")) cfg <- list(app = list(db_table = "DEV_APP_LOGS"), system = list(db_table = "DEV_LOGS")) #   data <- readr::read_lines(file = f_iter$fname, progress = FALSE) log_df <- setDT(tibble::enframe(data, name = NULL)) %>% .[, log_line_start := re2r::re2_detect(value, pattern = "^\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}", parallel = F)] %>% .[, log_line_number := cumsum(log_line_start)] %>% .[, body := stri_c(value, collapse = "\n"), by = log_line_number] %>% .[, `:=`(value = NULL, log_line_start = NULL, log_line_number = NULL)] %>% tibble::as_tibble() %>% #  body = character(0)      0  #      POSIXct tidyr::extract(col = "body", into = c("timestamp", "tz", "level", "module", "class", "message"), # tz   (  DEV),      ( DEV) regex = "^(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}:\\d+([+-]\\d+)?) (.*?) <(.*?)> \\[(.*?)\\] (?s:(.*))$", case_insensitive = TRUE, ignore.case = TRUE) %>% #     ISO         (   ?) #  ISO 8601 (https://en.wikipedia.org/wiki/ISO_8601) mutate_at("timestamp", re2r::re2_replace, # tz   (  DEV),      ( DEV) pattern = "(.*) (\\d{2}:\\d{2}:\\d{2}):(\\d+([+-]\\d+)?)", replacement = "\\1T\\2.\\3") %>% mutate_at("timestamp", lubridate::as_datetime, tz = "Europe/Moscow") %>% #    mutate(location = f_iter$location, wk = f_iter$wk) # TRUNCATE  CH    ,           #    CH, ms    (timestamp %% 1) conn <- DBI::dbConnect(RClickhouse::clickhouse(), host = "10.0.0.1", db = "DEV_LOGS") # m <- DBI::dbExecute(conn, glue("ALTER TABLE {table_name}")) write_res <- log_df %>% mutate(ms = (as.numeric(timestamp) %% 1) * 1000) %>% select(location, wk, timestamp, ms, level, module, class, message) %>% #            DBI::dbWriteTable(conn, cfg[[log_type]][["db_table"]], ., append = TRUE) DBI::dbDisconnect(conn) #       res <- tibble::tibble(id = f_iter$id, lines = nrow(log_df), min_t = min(log_df$timestamp), max_t = max(log_df$timestamp), write_res) rm(data, log_df) return(res) } #    tic("Batch processing") #    gc(full = TRUE) nworkers <- parallel::detectCores() - 1 registerDoFuture() # future::plan(multiprocess) # future::plan(multisession) future::plan(multisession, workers = nworkers) # future::plan(sequential) #  ~  #      CH #   ------------------ fnames_tbl <- here::here("raw_data") %>% fs::dir_ls(recurse = TRUE, glob = "*dev_app*.gz") %>% enframe(name = "fname") %>% #         mutate(short_fname = as.character(fs::path_rel(fname, start = "./raw_data"))) %>% select(-value) %>% mutate(size = fs::file_size(fname)) %>% tidyr::extract(col = "short_fname", into = c("location", "wk"), regex = "^([^/]+)/wk(\\d+)", remove = FALSE) %>% arrange(size) %>% mutate(id = paste(format(row_number(), justify = "r", width = 4), "/", n())) %>% #   ~ N  mutate(chunk = (row_number() %% nworkers + 1)) %>% #    ,  dopar    arrange(chunk) start_time <- Sys.time() stat_list <- foreach(it = iter(fnames_tbl, by = "row"), .export = c("start_time"), .verbose = TRUE, .inorder = FALSE, .errorhandling = "remove") %dopar% { #   flog.appender(appender.file(common_logname)) # flog.info(capture.output(gc(verbose = TRUE))) res <- oneTimeProcessing(it, log_type = "app") flog.info(glue("Step {it$id} finished.", "Elapsed {round(difftime(Sys.time(), start_time, units = 'mins'), digits = 2)} min(s) ----------->", .sep = " ")) return(res) } flog.info("Load finished") #    -------------- #    ,    future::plan(sequential) gc(reset = TRUE, full = TRUE) flog.info(capture.output(toc())) #     ------------- logstat_tbl <- stat_list %>% dplyr::bind_rows() %>% #    left_join(fnames_tbl, by = "id") %>% #          mutate(delta_t = as.numeric(difftime(max_t, min_t, units = "mins"))) %>% arrange(min_t) write_delim(logstat_tbl, here::here("output", "DEV_parse_stat.csv.gz"), delim = ";") # ,     ? if(nrow(logstat_tbl) < nrow(fnames_tbl)){ flog.error("!!!!!!! Not all workers were executed successfully !!!!!!!!!") } 

рдЗрд╕ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╕рдорд╛рдирд╛рдВрддрд░ рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╕рдорд╛рдирд╛рдВрддрд░рдХрд░рдг, рд╕рдордп рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб, рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЛ рд╕рд╣реЗрдЬрдирд╛, рдорд▓реНрдЯреА-рд▓рд╛рдЗрди рд░рд┐рдХреЙрд░реНрдб рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрд╛рдВрдХрди, рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛, рдмрд╛рд╣рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмреЗрдВрдЪрдорд╛рд░реНрдХрд┐рдВрдЧ рдФрд░ рдЗрд╖реНрдЯрддрдо рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рдкреИрдХреЗрдЬ ( re2r ) рдХреЛ re2r , рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП; рдирд┐рдпрдорд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Google рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдХреЛрдб { bencmark рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдПрдХ рд╣реА рдХреНрд▓рд┐рдХрд╣рд╛рдЙрд╕ рд▓реЗрдВ , рдХреБрдЫ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкрд╛рд╕ ILV рдмрдВрдж рд╣реЛ рд╕рдХрддрд╛ рд╣реИ})ред рд▓реЗрдХрд┐рди рдХреЛрдб рдЖрджрд░реНрд╢ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдкрд░ рд╕рд┐рд░реНрдл рдПрдХ рдмрд╛рд░ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИред рдпрд╣ рдЬрд▓реНрджреА рдФрд░ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИред рдПрдХ рдФрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╣реА рдХрд░рддреЗ рд╣реИрдВ, рдЦрд╛рддреЗ рдореЗрдВ рд╕рдореНрдорд╛рди рд▓реЗрддреЗ рд╣реИрдВред рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛


рдХреНрдпрд╛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рддреИрдпрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордп рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рддреЗрдЬреА рд╕реЗ рд╣реЛрдЧрд╛? рд╕рд╡рд╛рд▓ рдЦреБрд▓рд╛ рд╣реИред python , perl , awk рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рдХреЛрдИ рд╣рдбрд╝рддрд╛рд▓реА рдЕрдВрддрд░ рдирд╣реАрдВ рджрд┐рдЦрд╛ред рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ python рдореЗрдВ рдЧреБрд░реБ рдмреЗрд╣рддрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЧреБрдЬрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЖрд╡рдзрд┐рдХ "рд╡рди-рдЯрд╛рдЗрдо" рдХрд╛рд░реНрдп рд╣реИред


рддрд╕реНрд╡реАрд░реЛрдВ рдореЗрдВ рдЖрджреЗрд╢ рдмрд╣рд╛рд▓ рдХрд░рдирд╛


рд╣рд╛рде рдкрд░ рдХрдИ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдпрд╛рддреНрд░рд╛ рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рд╕рднреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд╢реВрдЯрд┐рдВрдЧ рддрд┐рдерд┐ ( YYYY-MM-DD hh_mm_ss ) рджреНрд╡рд╛рд░рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдирд╛рдо рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдордп рдХреЗ рддреАрд░ рдкрд░ рдлреЛрдЯреЛ рдХрд╛ рдХреНрд░рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрддрд╛ рд╣реИред Exif рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдПрдХ рдЪрд░рдг рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВред


рдФрд░ рдпрд╣ рднреА "рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ" рдореЗрдВ рдЖрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП exifr рдФрд░ exifr ред


  • рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдИ;
  • рдмрд╛рд╣рд░ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ;
  • рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрд┐рдП рдЧрдП рдПрд╕реАрд╕реА рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЧрдИред рд╕рд╣реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рд╕рд╛рдеред

рддрдереНрдп рдХреА рдмрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ, рдХрд╛рд░реНрдп рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рд╕реЗ рдПрдХрддреНрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреА рдПрдХреНрд╕рд┐рдл рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛, рдФрд░ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдХрдВрдХрд╛рд▓ рдФрд░ рдХрд╛рдо рдХреЗ рддрд░реНрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреЗ рд╣реИрдВред


рдирдореВрдирд╛ рддреНрд╡рд░рд┐рдд рд╣рд╛рде рдХреЛрдб:
 library(tidyverse) library(magrittr) library(stringi) library(lubridate) library(stringi) library(fs) library(glue) library(futile.logger) library(anytime) library(tictoc) library(bench) library(exifr) library(tictoc) input_path <- "S:/ " %>% fs::path_real() #       output_path <- "S:/ " %>% fs::path_real() i_fnames <- input_path %>% fs::dir_ls(recurse = TRUE, regexp = "(JPG|jpg)$") raw_df <- read_exif(i_fnames, tags = c("SourceFile", "Model", "DateTimeOriginal")) %>% #      base64, ,    mutate(tmp = sub("^base64:(.*)", "\\1", SourceFile)) %>% mutate(i_fname = purrr::map_chr(tmp, ~rawToChar(jsonlite::base64_dec(.)))) %>% mutate(tm = anytime::anytime(DateTimeOriginal)) %>% select(i_fname, DateTimeOriginal, model = Model, tm) #         clean_df <- raw_df %>% mutate(timestamp = case_when( model == 'iPhone ...' ~ tm, model == 'Nikon ...' ~ tm - lubridate::minutes(56), model == 'Samsung ...' ~ tm - lubridate::minutes(62), TRUE ~ tm) ) %>% mutate_at("i_fname", fs::path_real) %>% mutate(fname = format(timestamp, format = '%Y-%m-%d %H_%M_%S')) %>% #  ,     (""),      mutate(fname = dplyr::coalesce(fname, fs::path_ext_remove(fs::path_file(i_fname)))) %>% #  ,         group_by(fname) %>% mutate(n = n(), idx = row_number()) %>% ungroup() %>% #        mutate(fname = case_when( n > 1 ~ stri_c(fname, '_', idx), TRUE ~ fname ) ) %>% mutate(o_fname = fs::path(!!output_path, paste0(fname, ".jpg"))) #     janitor::get_dupes(clean_df, o_fname) #   tic(" ") clean_df %$% # purrr::walk2(i_fname, o_fname, ~print(glue("{.x} -> {.y}"))) purrr::walk2(i_fname, o_fname, ~fs::file_copy(.x, .y, overwrite = TRUE)) toc() #              

рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ exifr ? рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдЙрдкрдпреЛрдЧрд┐рддрд╛ ExifTool рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИред


рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд▓рдЧ рд░рд╣рд╛ рд╣реЛ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдмрд╣рд╕ рдХрд░рдирд╛ рдХрдард┐рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХреНрдЬрд╝рд┐рдлрд╝ рдФрд░ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдФрд░ рдЬреАрдпреВрдЖрдИ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рд╕рднреА рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╕рдордп рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд╣реАрдВ рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдордп рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреИрдорд░реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреИрдорд░рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рддрдиреА рдмрд╛рд░ рдЙрд╕ рдкрд░ рд╕рдЯреАрдХ рд╕рдордп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ?), рдЗрд╕рд▓рд┐рдП рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдордп рдЯрд┐рдХрдЯреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рд╕рдорд╛рдкрди


рдЗрд╕реА рддрд░рд╣ рдХреА рдХрдИ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХрдИ рдХреЛ рдЖрд░ рдХреА рдорджрдж рд╕реЗ рднреА рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд╢рди - "рдмрдЪреНрдЪреЗ, рдЧрдгрд┐рдд рдФрд░ рдЖрд░" ред

Source: https://habr.com/ru/post/hi464849/


All Articles