【问题标题】:How to combine many csv files into a large csv without holding the whole object in RAM如何在不将整个对象保存在 RAM 中的情况下将许多 csv 文件组合成一个大 csv
【发布时间】:2015-11-19 23:35:15
【问题描述】:

我正在将 csv 文件合并为一个无法放入我机器 RAM 的大型 csv 文件。无论如何要在R中这样做吗?我意识到我可以将每个单独的 csv 文件加载到 R 中并将文件附加到现有的数据库表中,但出于古怪的原因,我希望最终得到一个大的 csv 文件。

【问题讨论】:

    标签: r


    【解决方案1】:

    尝试逐个读取每个 csv 文件,并使用write.table 和选项append = T 写出。

    类似这样的:

    1. 读取一个 csv 文件;
    2. write.table(..., append = T) 到最终的 csv 文件;
    3. 删除带有rm()的表;
    4. gc()

    重复直到所有文件都写完。

    【讨论】:

      【解决方案2】:

      您可以使用选项append = TRUE

      first <- data.frame(x = c(1,2), y = c(10,20))
      second <- data.frame(c(3,4), c(30,40))
      write.table(first, "file.csv", sep = ",", row.names = FALSE)
      write.table(second, "file.csv", append = TRUE, sep = ",", row.names = FALSE, col.names = FALSE)
      

      【讨论】:

        【解决方案3】:

        首先创建 3 个测试文件,然后创建一个包含它们名称的变量 Files。我们使用Sys.glob 来获取文件名的向量,但您可能需要修改此语句。然后将outFile 定义为输出文件的名称。对于Files 的每个组件,读入具有该名称的文件并将其写出。如果它是第一个文件,则将其全部写出,如果是后续文件,则将其全部写入,但确保使用 append = TRUE 的标头除外。请注意,每次读入文件时都会覆盖L,因此一次只有一个文件占用空间。

        # create test files using built in data frame BOD
        write.csv(BOD, "BOD1.csv", row.names = FALSE)
        write.csv(BOD, "BOD2.csv", row.names = FALSE)
        write.csv(BOD, "BOD3.csv", row.names = FALSE)
        
        Files <- Sys.glob("BOD*.csv") # modify as appropriate
        outFile <- "out.csv"
        
        for(f in Files) { 
          L <- readLines(f)
          if (f == Files[1]) cat(L, file = outFile, sep = "\n") 
          else cat(L[-1], file = outFile, sep = "\n", append = TRUE)
        }
        
        # check that the output file was written properly
        file.show(outFile)
        

        循环也可以替换为:

        for(f in Files) { 
          d <- read.csv(f)
          first <- f == Files[1]
          write.table(d, outFile, sep = ",", row.names = FALSE, col.names = first, append = !first)
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-09-23
          • 2019-04-09
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2014-05-17
          相关资源
          最近更新 更多