如何使用R按列将.csv文件拆分为多个.csv文件?

3
我是一位能够帮助翻译的助手。
我有一个超过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个带有1000多行的CSV文件。
现在尝试使用 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 代码参考


1024列限制到底是从哪里来的?数据库吗? - MichaelChirico
首先的问题:为什么你的表格有成千上万列?这既是数据库设计问题也是数据集问题。大多数分析都需要长格式(而非宽格式)。 - Parfait
这是我接收用于处理我无法控制的数据的方式。为了将它们加载到具有1024限制的数据库中,仍然使用.CSV格式,我想要将其拆分。@parafait - vap0991
@vap0991 你能否将这个csv文件的至少一部分上传到类似bpaste的网站上吗?比如前100行之类的? - G_M
[链接](https://bpaste.net/raw/4fda3d64230e)@DeliriousLettuce - vap0991
显示剩余6条评论
1个回答

0
“迟到总比不到好 :) 这里是基于代码生成库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,
        )


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接