在Silverstripe #silverstripe中的csv文件中没有标题行时使用CsvBulkLoader

时间:2013-08-25 23:38:59

标签: csv silverstripe fgetcsv

对于CSV文件导入,Silverstripe提供了一个很好的CsvBulkLoader类。但它要求文件中的第一行是列名。在我的例子中,客户文件没有标题行,第一行也是数据。 在这种情况下,有一种简单的方法吗? 问题是它想知道哪个列将转到数据库中的哪个字段。

2 个答案:

答案 0 :(得分:2)

您可以在自定义CsvBulkUploader类中设置public $hasHeaderRow = false;。例如:

class MyCsvBulkUploader extends CsvBulkUploader {
    public $hasHeaderRow = false;
    //custom code here
}

请注意,除了最简单的情况之外,您还需要编写自己的自定义CsvBulkUploader。有关如何在http://doc.silverstripe.org/framework/en/trunk/howto/csv-import

页面底部编写自定义上传器的一些有用的教程

答案 1 :(得分:0)

实际上,在做完之后,我发现Silverstripe CsvBulkLoader类并不高效​​。如果文件很大,则内存不足。此外,它不允许ploading zipfile,但csv文件太大,无法上传。 我编写了自己的自定义类,它非常快,可以从zip读取cvs文件内容。 在silverstripe中查找重复项,它们会在列表中搜索对象是否存在。这意味着每次需要检查记录存在时,它都会从开始遍历列表。我拥有的csv文件有近一百万条记录。对于silverstripe需要几个我们来运行它。但我的类检查与isset数组键重复,并且还通过原始sql拉取现有记录。循环时的Silverstripe数据模型为每个循环创建另一个查询,这意味着接近一百万个查询。 原始SQL运行速度非常快。