获取多个 CSV 文件的行数和列数

Posted

技术标签:

【中文标题】获取多个 CSV 文件的行数和列数【英文标题】:Get the number of rows and columns of a multiple CSV file 【发布时间】:2022-01-06 02:32:49 【问题描述】:

有没有办法在 R 中获取有关多个 CSV 文件的行数和列数的信息并将其保存在 CSV 文件中?这是我的 R 代码:

#Library
if (!require("tidyverse")) install.packages("tidyverse")
if (!require("fs")) install.packages("fs")

#Mentioning Files Location
file_paths <- fs::dir_ls("C:\\Users\\Desktop\\FileCount\\Test")
file_paths[[2]]


#Reading Multiple CSV Files
file_paths %>%
  map(function(path)
  
     read_csv(path,col_names = FALSE)
  )

#Counting Number of Rows
lapply(X = file_paths, FUN = function(x) 
  length(count.fields(x))
)

#Counting Number of Columns
lapply(X = file_paths, FUN = function(x) 
  length(ncol(x))
)

#Saving CSV File
write.csv(file_paths,"C:\\Users\\Desktop\\FileCount\\Test\\FileName.csv", row.names = FALSE)

有几件事不起作用:

    多个 CSV 文件的列数 当我保存文件时,我想保存文件名、行数和列数。见附图。

输出的样子:

附上一些用于测试的CSV文件:Here

任何帮助表示赞赏。

【问题讨论】:

【参考方案1】:

欢迎!使用tidyversedata.table,这是一种方法:

注意:所有 .csv 文件都在我的 TestStack 目录中,但您可以使用自己的目录 (C:/Users/Desktop/FileCount/Test) 进行更改。

代码:

library(tidyverse)
csv.file <- list.files("TestStack") # Directory with your .csv files
data.frame.output <- data.frame(number_of_cols = NA,
                                number_of_rows = NA,
                                name_of_csv = NA) #The df to be written


MyF <- function(x)
  
  csv.read.file <- data.table::fread(
    paste("TestStack", x, sep = "/")
    )
  
  number.of.cols <- ncol(csv.read.file)
  
  number.of.rows <- nrow(csv.read.file)
  
  data.frame.output <<- add_row(data.frame.output,
                                number_of_cols = number.of.cols,
                                number_of_rows = number.of.rows,
                                name_of_csv = str_remove_all(x,".csv")) %>% 
    filter(!is.na(name_of_csv))
  


map(csv.file, MyF)

输出:

  number_of_cols number_of_rows name_of_csv
1              3           2150      CH_com
2              2          34968 epci_com_20
3              3            732        g1g4
4              7         161905          RP

我有这个输出是因为我的 TestStack 有 4 个文件,分别命名为 CH_com.csv、epci_com_20.csv、...

然后,您可以根据需要将对象 data.frame.output 写入 .csv:data.table::fwrite(data.frame.output, file = "Output.csv")

【讨论】:

我建议读取文件一次,并抓住nrow和ncol,没有理由读取文件两次。 @MerijnvanTilborg 是的,你是对的,我在看到预期的行数后添加了第二个阅读,我会更新【参考方案2】:
files_map <- "test"
files <- list.files(files_map)

library(data.table)

output <- data.table::rbindlist(
  lapply(files, function(file) 
    dt <- data.table::fread(paste(files_map, file, sep = "/"))
    list("number_of_cols" = ncol(dt), "number_of_rows" = nrow(dt), "name_of_csv" = file)
  )
)

data.table::fwrite(output, file = "Filename.csv")

或者使用 map 和单独的函数来完成任务,但不首先使用空表并使用全局分配对其进行更新。我看到这在应用函数上经常发生,而根本不需要它。

myF <- function(file) 
    dt <- data.table::fread(paste(files_map, file, sep = "/"))
    data.frame("number_of_cols" = ncol(dt), "number_of_rows" = nrow(dt), "name_of_csv" = file)


output <- do.call(rbind, map(files, myF))

【讨论】:

以上是关于获取多个 CSV 文件的行数和列数的主要内容,如果未能解决你的问题,请参考以下文章

Java 数组 获取二维数组的行数和列数

如何获取ResultSet的行数和列数

VBA中如何获取一个表格的行数和列数

Pandas获取DataFrame的行数和列数

如何在 C++ 中获取二维动态数组的行数和列数

如何获取 javascript 中用于 flexbox 和网格布局的行数和列数?