我正在使用C#,并将我的数据写入csv文件(以供进一步使用)。然而,我的文件已经增长到很大的规模,我必须转置它们。做这件事最简单的方法是什么?在任何程序中?
Gil
发布于 2011-05-09 23:34:14
按照复杂性的递增顺序(以及处理大文件的能力递增顺序):
的大小
List<Int64>
中。然后迭代所有行,对于每一行:查找到保存的位置,将一个单元格复制到输出,保存新位置。重复此操作,直到用完所有列(所有行都到达换行符)。所需的
类似于上面的
中只有一个包含所有数据的条带
最后一点:您可以通过使用C++ (或任何支持适当指针的语言)、内存映射文件和指针而不是文件偏移量来获得更高的性能。
发布于 2011-05-05 16:42:40
这真的要看情况。你是从数据库中获取这些数据的吗?您可以使用MySql导入语句。http://dev.mysql.com/doc/refman/5.1/en/load-data.html
或者,您可以使用use循环遍历数据,并使用streamwriter对象将其添加到文件流中。
StreamWriter sw = new StreamWriter('pathtofile');
foreach(String[] value in lstValueList){
String something = value[1] + "," + value[2];
sw.WriteLine(something);
}
发布于 2011-05-09 22:27:00
我在这里用python写了一个小的概念验证脚本。我承认它有缺陷,可能会有一些性能改进,但它会做到的。我在一个40x40的文件上运行它,并得到了想要的结果。我开始在更像你的示例数据集的东西上运行它,我花了太长的时间等待。
path = mkdtemp()
try :
with open('/home/user/big-csv', 'rb') as instream:
reader = csv.reader(instream)
for i, row in enumerate(reader):
for j, field in enumerate(row):
with open(join(path, 'new row {0:0>2}'.format(j)), 'ab') as new_row_stream:
contents = [ '{0},'.format(field) ]
new_row_stream.writelines(contents)
print 'read row {0:0>2}'.format(i)
with open('/home/user/transpose-csv', 'wb') as outstream:
files = glob(join(path, '*'))
files.sort()
for filename in files:
with open(filename, 'rb') as row_file:
contents = row_file.readlines()
outstream.writelines(contents + [ '\n' ])
finally:
print "done"
rmtree(path)
https://stackoverflow.com/questions/5901167
复制