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

在Silverstripe#Silverstripe中的csv文件中没有标题行时使用CsvBulkLoader,csv,silverstripe,fgetcsv,Csv,Silverstripe,Fgetcsv,对于CSV文件导入,Silverstripe提供了一个很好的类CsvBulkLoader。但它要求文件中的第一行是列名。在我的例子中,客户文件没有标题行,第一行也是数据。 在这种情况下有没有简单的方法? 问题是它想知道哪个列将转到数据库中的哪个字段 实际上,在完成之后,我发现Silverstripe CsvBulkLoader类没有效率。如果文件很大,则会耗尽内存。此外,它不允许加载zipfile,但csv文件太大,无法上载。 我编写了自己的自定义类,该类速度非常快,可以从zip读取cvs文件内

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

实际上,在完成之后,我发现Silverstripe CsvBulkLoader类没有效率。如果文件很大,则会耗尽内存。此外,它不允许加载zipfile,但csv文件太大,无法上载。 我编写了自己的自定义类,该类速度非常快,可以从zip读取cvs文件内容。 在silverstripe中,为了查找重复项,他们在列表中搜索对象是否存在。这意味着每次需要检查记录是否存在时,它都会从头开始遍历列表。我拥有的csv文件有近一百万条记录。因为silverstripe需要几个小时来运行它。但我的类通过isset数组键检查重复项,并通过原始sql提取现有记录。Silverstripe datamodel在循环时为每个循环进行另一个查询,这意味着近一百万个查询。
原始sql运行速度非常快

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

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

请注意,除了最简单的情况外,您还需要编写自己的自定义CsvBulkUploader。在页面底部的

有一些关于如何编写自定义上传程序的有用教程,标题行是CsvBulkLoader工作所必需的。您可以编辑CSV文件,使其在第一行中具有正确的列名。这个任务很简单,你可以教最终用户做这件事。这只对默认类是必要的。您可以省略自定义类中的标题行。见下面我的答案。