1

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

4

2 回答 2

2

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

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

请注意,除了最简单的情况之外,您还需要编写自己的自定义 CsvBulkUploader。在http://doc.silverstripe.org/framework/en/trunk/howto/csv-import的页面底部有一些关于如何编写自定义上传器的有用教程

于 2014-04-06T09:11:02.720 回答
0

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

于 2013-08-27T00:30:42.310 回答