【问题标题】:How to split .csv into multiple .csv by columns using R?如何使用 R 将 .csv 按列拆分为多个 .csv?
【发布时间】:2018-08-21 20:11:24
【问题描述】:

我有一个包含 3000 多列的巨大 .CSV 文件,需要将它们加载到数据库中,并且由于表限制为 1024 列,我想将这些 .CSV 文件拆分为 1024 列或更少列的多个文件。

到目前为止,我在有关此主题的先前问题的帮助下尝试过什么 -

Python -

 import csv 
 import file
 input import os 
 source = 'H:\\Programs\\Exploratory Items\\Outdated\\2018\\csvs\\' for root, dirs, filenames in os.walk(source): 
for f in filenames: 
fullpath = os.path.join(source, f) 
output_specifications = ( (fullpath[:-4] + 'pt1.csv', slice(1000)
(fullpath[:-4] + 'pt2.csv', slice(1000, 2000)), 
(fullpath[:-4] + 'pt3.csv', slice(2000, 3000)), 
(fullpath[:-4] + 'pt4.csv', slice(3000, 4000)), 
(fullpath[:-4] + 'pt5.csv', slice(4000, 5000)), ) 
output_row_writers = [ 
( 
  csv.writer(open(file_name, 'wb'), 
  quoting=csv.QUOTE_MINIMAL).writerow, selector,
  ) for file_name, selector in output_specifications ] 

 reader = csv.reader(fileinput.input()) 
 for row in reader: 
 for row_writer, selector in output_row_writers: row_writer(row[selector])

上述 python 代码的问题是拆分和写入这些文件需要很长时间,因为我的理解是按行写入。不适合我的情况,因为我有 200 多个 .CSV 文件,每个文件有 1000 多行。

现在试试 -

-cut 命令(POSIX),但我使用的是 Windows,所以将在 Ubuntu 平台上尝试这个。

想在 R 中试试这个:

我有一个代码可以将我的所有 SPSS 转换为 .csv,它可以有效地工作,所以我想在这个阶段添加更多内容,以便它可以将我的文件按列拆分为多个 .csv。

setwd("H:\\Programs\\2018")
getwd()
list.files()

files <- list.files(path = '.', pattern = '.sav')

library(foreign)
for (f in files) { #iterate over them
data <- read.spss(f, to.data.frame = TRUE, use.value.labels = FALSE )
write.csv (data, paste0(strsplit(f, split = '.', fixed = T)[[1]][1], '.csv'))
}  

谢谢

参考 - Python code ref

【问题讨论】:

  • 1024 列的限制究竟来自哪里?数据库?
  • 第一个也是最重要的问题:为什么您的表有数千列?这既是数据库设计问题,也是数据集问题。大多数分析总是需要长格式(不是宽格式)。
  • 这就是我接收数据以处理我无法控制的事情的方式。这仍然是 .CSV 格式,以便将它们加载到有 1024 个限制的数据库中,我想拆分它。 @parafait
  • @MichaelChirico 是的数据库
  • @vap0991 你能把这个csv的至少一部分上传到bpaste这样的地方吗?也许前 100 行之类的?

标签: python r csv


【解决方案1】:

迟到总比没有好 :) 这是基于代码生成库的解决方案 - convtools

from convtools import conversion as c
from convtools.contrib.tables import Table


columns_per_file = 1000
for filename in filenames:
    # reading columns
    columns = Table.from_csv(filename, header=False).columns

    # slicing
    for part_number, i in enumerate(
        range(0, len(columns), columns_per_file), 1
    ):
        Table.from_csv(filename, header=False).take(
            # taking only needed ones
            *(col for col in columns[i : i + columns_per_file])
        ).into_csv(
            # streaming to the part
            "{}.pt{}.csv".format(filename.replace(".csv", ""), part_number),
            include_header=False,
        )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-01-27
    相关资源
    最近更新 更多