2011-05-05 84 views
0

我正在使用C#,并将我的数据写入csv文件(供进一步使用)。然而,我的文件已经发展到一个很大的规模,我不得不转置它们。最简单的方法是什么?在任何程序中?用C#或其他程序转置csv文件

Gil

+3

调换他们如何和什么?为什么你只接受25%的答案给你? – 2011-05-05 16:34:19

+0

你能澄清你的意思是“转置”吗? – 2011-05-05 16:34:39

+0

你的意思是像一个矩阵转置,把第一行变成第一列,第二行变成第二列,等等? – 2011-05-05 16:44:58

回答

2

在日益复杂的顺序(并且还增加了处理大文件的能力顺序):

  • 了解整个事情成2 d阵列(或锯齿状排列又名阵列OF-阵列)。
    • 内存要求:等于文件
    • 的大小

  • 轨道的文件中的每一行内的偏移。首先找到每个(非引用)换行符,将当前位置存储到List<Int64>。然后遍历所有行,对于每一行:寻找保存的位置,将一个单元格复制到输出,保存新的位置。重复,直到你用尽列(所有行到达换行符)。
    • 内存要求:每行八个字节
    • 频繁的文件散落在比磁盘颠簸和悲惨的性能磁盘缓存结果更大的文件查找,但它不会崩溃。

  • 上面一样,但在例如的工作块8k行。这将创建一组包含8k列的文件。输入块和输出都适合磁盘缓存,因此不会发生抖动。在创建条纹文件之后,迭代条纹,从每个条纹文件读取一行并追加到输出。重复所有行。这会导致对每个文件进行顺序扫描,这也具有非常合理的缓存行为。
    • 需要的内存:第一遍为64k,第二遍为(列数/ 8k)文件描述符。
    • 对于每个维度高达几百万的表格而言性能良好。对于更大的数据集,只需将几条(例如1k)的条带文件组合在一起,制作一组较小的条带,重复,直到只有一个文件中的所有数据都有一个条带。

最后的评论:您可能会通过使用C++(或适当指针支持任何语言),内存映射文件挤出更多的性能,以及指针而不是文件偏移。

0

这真的取决于。你从数据库中获得这些吗?您可以使用MySql导入语句。 http://dev.mysql.com/doc/refman/5.1/en/load-data.html

或者你可以使用可以通过数据循环使用streamwriter对象将它添加到文件流中。

StreamWriter sw = new StreamWriter('pathtofile'); 
foreach(String[] value in lstValueList){ 
String something = value[1] + "," + value[2]; 
sw.WriteLine(something); 
} 
+0

问题是文件很大:26000X10000当转置时,我甚至可以在Excel中处理该文件。 明显SQL和MySql无法导入那么多 – gilibi 2011-05-05 16:44:30

0

我在这里的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) 
相关问题