转换csv文件与c#或其他程序

本文关键字:其他 程序 csv 文件 转换 | 更新日期: 2023-09-27 17:54:51

我使用c#,我将数据写入csv文件(供进一步使用)。然而,我的文件已经发展到很大的规模,我必须转换他们。最简单的方法是什么?在任何节目中?

吉尔

转换csv文件与c#或其他程序

按复杂程度排序(同时也按处理大文件的能力排序):

  • 将整个内容读入二维数组(或锯齿数组,即数组的数组)。
    • 所需内存:等于文件大小

  • 跟踪每行内的文件偏移量。首先查找每个(未加引号的)换行符,将当前位置存储到List<Int64>中。然后遍历所有行,对于每一行:查找保存的位置,将一个单元格复制到输出,保存新位置。重复此操作,直到用完所有列(所有行都到达换行符)。
    • 所需内存:每行8字节
    • 频繁的文件查找分散在一个比磁盘缓存大得多的文件中,会导致磁盘抖动和糟糕的性能,但不会崩溃。

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

最后注释:使用c++(或任何具有适当指针支持的语言)、内存映射文件和指针代替文件偏移量可能会提高性能。

这得看情况。你是从数据库里找出来的吗?您可以使用MySql导入语句。http://dev.mysql.com/doc/refman/5.1/en/load-data.html

或者您可以使用could遍历数据,使用streamwriter对象将其添加到文件流中。

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

我在这里用python写了一个小的概念验证脚本。我承认它有很多bug,性能上可能还需要改进,但它会做到的。我在一个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)